Backbone.js 在主干中触发两次model.save()的更改事件
我已创建视图以听取模型更改。当模型中发生更改时,将调用“渲染”函数并提示“警报”窗口。但它出现了两次,这意味着由于两个更改事件,渲染函数调用了两次 葡萄酒详情视图Backbone.js 在主干中触发两次model.save()的更改事件,backbone.js,Backbone.js,我已创建视图以听取模型更改。当模型中发生更改时,将调用“渲染”函数并提示“警报”窗口。但它出现了两次,这意味着由于两个更改事件,渲染函数调用了两次 葡萄酒详情视图 app.WineView=Backbone.View.extend({ 这不是因为僵尸视图,因为我有以下代码 Backbone.View.prototype.close=function() { alert("closing view "+this); if(this.beforeClose){ thi
app.WineView=Backbone.View.extend({ 这不是因为僵尸视图,因为我有以下代码
Backbone.View.prototype.close=function()
{
alert("closing view "+this);
if(this.beforeClose){
this.beforeClose();
}
this.remove();
this.unbind();
if(this.onClose){
this.onClose();
}
}
请告诉我这个代码有什么错误。谢谢你:)因此,由于您没有提供有关您的
模型#save
调用的信息,我将假设它是您视图中的一个。我还将假设问题不是来自僵尸视图,因为您采用的是过时的方法。我将在这里猜测可能发生的情况:
this.model.set({
name:$('#name').val(),
grapes:$('#grapes').val(),
country:$('#country').val(),
region:$('#region').val(),
year:$('#year').val(),
description:$('#description').val()
});
// ...
this.model.save();
好的,第一部分(设置方法)将触发第一个更改事件。第二部分,
save
方法可能会触发另一个更改。另一个set
确实会使用从服务器返回的属性完成
可能问题的可能解决方案:save
可以传递属性和wait
标志,推迟使用set
方法,直到服务器响应:
this.model.save({
name:$('#name').val(),
grapes:$('#grapes').val(),
country:$('#country').val(),
region:$('#region').val(),
year:$('#year').val(),
description:$('#description').val()
}, {wait: true});
您也可以通过始终创建模型的新实例进行尝试,如:
var wine = new WineModel({
name:$('#name').val(),
grapes:$('#grapes').val(),
country:$('#country').val(),
region:$('#region').val(),
year:$('#year').val(),
description:$('#description').val()
});
然后将其保存为:
wine.save(null, success: function(model){
// do your call action on call back
},
beforeSend: function() {
// before save
}
error: function(model, errors) {
// on error occurred
});
仅供参考,因为Bacbone 0.9.9(很久以前)引入了
listenTo
和stopListening
方法,允许跟踪监听器,从而使用remove
方法清除监听器,所以您并不真正需要这样的close
方法。(我想你遵循的是德里克·贝利的方法,该方法是在0.9.9之前写成的)是的,我遵循的是德里克·贝利的方法。但是为什么更改事件会触发两次?有什么想法吗?请看我的答案,如果不是这样,请添加更多信息。
wine.save(null, success: function(model){
// do your call action on call back
},
beforeSend: function() {
// before save
}
error: function(model, errors) {
// on error occurred
});