当我尝试通过save
更新Backbone中的模型时,模型上的更改事件会被触发两次。事件按此顺序触发。
但是,如果我通过(wait: true)
,则只会触发第一个change
事件。
任何人都可以解释为什么会发生这种情况,以及如何在不通过change
的情况下让(wait: true)
只触发一次?
两个变化事件:
editItem: function() {
this.model.save({
name: "Howard the Duck"
});
}
一个改变事件:
editItem: function() {
this.model.save({
name: "Howard the Duck"
}, (wait: true);
}
伪代码:
App.Views.Item = Backbone.View.extend({
initialize: function() {
this.model.on("change", this.changing, this);
this.model.on("request", this.requesting, this);
this.model.on("sync", this.syncing, this);
},
events: {
"click a": "editItem"
},
editItem: function() {
this.model.save({
name: "Howard the Duck"
});
}
changing: function() {
console.log("changing");
},
requesting: function() {
console.log("requesting");
},
syncing: function() {
console.log("syncing");
}
});
答案 0 :(得分:7)
以下是在更改属性时保存模型时发生的情况的分解:
model.set
将数据作为参数传递
options.wait
是假的时候触发更改事件model.set
包含从服务器返回的数据options.wait
真实或者服务器返回的数据不是模型知道的时候触发更改事件您的服务器可能会返回修改后的属性,该属性会触发第二个更改事件。使用
修改您的回复或限制您的事件倾听this.model.on("change:name", this.changing, this);
比较这些小提琴
http://jsfiddle.net/nikoshr/ZWFWx/
响应是客户发送的内容
您应该看到更改 - 请求 - 同步
http://jsfiddle.net/nikoshr/QT3YJ/
模拟您的问题的版本,其中服务器添加模型中不存在的值
更改 - 请求 - 更改 - 同步