私は、Python の CherryPy フレームワークで書かれた安らかな API を搭載した Web アプリケーションに取り組んでいます。jQuery とサーバー側のテンプレートを組み合わせてユーザー インターフェイスを書き始めましたが、jQuery が手に負えなくなってきたため、最終的に Backbone.js に切り替えました。
残念ながら、モデルをサーバーと同期させるのに問題があります。私のコードの簡単な例を次に示します。
$(function() {
var User = Backbone.Model.extend({
defaults: {
id: null,
username: null,
token: null,
token_expires: null,
created: null
},
url: function() {
return '/api/users';
},
parse: function(response, options) {
console.log(response.id);
console.log(response.username);
console.log(response.token);
console.log(response.created);
return response;
}
});
var u = new User();
u.save({'username':'asdf', 'token':'asdf'}, {
wait: true,
success: function(model, response) {
console.log(model.get('id'));
console.log(model.get('username'));
console.log(model.get('token'));
console.log(model.get('created'));
}
});
});
お分かりのように、ここでの目的は、新しいユーザーをサービスに登録することです。を呼び出すとu.save();、Backbone は実際に POST 要求をサーバーに送信します。関連するビットは次のとおりです。
リクエスト:
Request URL: http://localhost:8080/api/users
Request Method: POST
Request Body: {"username":"asdf","token":"asdf","id":null,"token_expires":null,"created":null}
応答:
Status Code: HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 109
Response Body: {"username": "asdf", "created": "2013-02-07T13:11:09.811507", "token": null, "id": 14, "token_expires": null}
ご覧のとおり、サーバーはリクエストを正常に処理し、idと の値を返しますcreated。しかし、何らかの理由で、コードが を呼び出すconsole.log(u.id);と を取得nullし、コードが を呼び出すconsole.log(u.created);と を取得しundefinedます。
tl;dr : を呼び出した後、Backbone.js がオブジェクトへの変更を保持しないのはなぜsave()ですか?
編集:コールバック
で get 関数を使用してモデル プロパティにアクセスできるように、上記のコードを修正しましたsuccess。これにより、元のコードの同時実行の問題が解決されます。
parseまた、モデルの関数にコンソール ロギングを追加しました。奇妙なことに、これらのそれぞれはundefined... Backbone.js が応答 JSON の解析に失敗しているということですか?
編集 2: 数日前、問題は実際には、HTTP 基本認証を有効にするためにすべての要求に追加していたカスタム ヘッダーであることがわかりました。詳細については、この回答を参照してください。