Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 在主干中触发两次model.save()的更改事件_Backbone.js - Fatal编程技术网

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
});