誰かがここで私を助けることができるかどうか疑問に思います。
クライアント側にbackbone.jsを実行している単一のページがあります
サーバーはsocket.ioを実行しています。
socket.ioをサポートするために、Backbonesのデフォルトの同期をbackbone.iobindの同期に置き換えました。
保存時にサーバーからエラー応答を取得し(計画されている)、保存のエラー関数をトリガーするバックボーンモデルがありますが、クライアント側のモデルは引き続き新しい値に更新されます。私の理解では、更新する前にサーバーからの成功応答を待機するwait:trueを含めましたが、これは私には起こりません。
サーバー側のsocket.ioコード
io.sockets.on('connection', function (socket) {
socket.on('test:create', function (data, callback) {
//err - used to fake an error for testing purposes
var err = true;
if (err) {
// error
callback('serv error');
} else {
// success
// The callback accepts two parameters: error and model. If no error has occurred, send null for error.
callback(null, data);
}
});
クライアントサイドコード
//HTML Code
//<div id="callBtns">
//<button id="runTest">Create</button>
//</div>
var CommunicationType = Backbone.Model.extend({
defaults: {
runTest: 'default'
},
urlRoot : '/test',
validate: function(attrs) {
//return 'error';
}
});
var BasicView = Backbone.View.extend({
el: $('#callBtns'),
initialize: function(){
_.bindAll(this);
},
events: {
"click #runTest": "runTestFn"
},
runTestFn: function() {
//causing the issue?
communicationType.set({runTest: 'value from set'});
communicationType.save({},{
success:function(model, serverResponse){
console.log('Success');
console.log(serverResponse);
},
error:function(model, serverResponse){
console.log('Error');
console.log(serverResponse);
console.log(JSON.stringify(communicationType));
},
wait: true
});
}
});
var communicationType = new CommunicationType();
var basicView = new BasicView();
この問題は、setを使用してモデルを直接更新していることが原因のように見えることに気付きました(communicationType.set({runTest:'value from set'});)
以下のコードのように、保存する前に値を設定せず、値を直接渡して保存すると、正しく機能します。
communicationType.save({runTest: 'value from save'},{
success:function(....
ただし、これは、保存機能を経由せずに新しい値を設定したり、モデルを更新したりできないことを意味します:/
だから私の質問は、setを使用しながら、これを正しく機能させるにはどうすればよいですか(サーバー側のエラーがある場合にクライアントモデルを更新しないようにする)?
どんな答えも本当にありがたいです!どうもありがとう