保存没有新属性的模型时,主干仍然会向服务器发送PUT

时间:2012-07-16 22:28:12

标签: backbone.js

change收听ProfileView上的EditView事件时,知道它何时应该重新呈现给用户个人资料。

如果用户只需点击"更新个人资料"来自EditView,但尚未更改任何属性(即,他不想编辑他的个人资料)仍然会发送PUT,但有没有change事件,因此在更改属性之前,用户将停留在编辑页面上。

为什么没有更改任何属性,骨干仍然会将其发送到服务器?

2 个答案:

答案 0 :(得分:3)

听起来我的应用程序中的逻辑存在缺陷。即。如果用户不想编辑他的个人资料,为什么用户会点击“更新个人资料”?也许您需要在该实例中使用备用导航方法。如果您告诉Backbone保存模型,那么它必须将数据发送到服务器才能执行此操作,因为它不知道您不需要它(您可能正在记录保存尝试或从服务器返回更新的值)。也许看一下使用changedAttributes方法来决定是否需要触发保存。

答案 1 :(得分:2)

回答你的问题,你可以检查模型是否有变化,只有在更改时才调用另一种方式直接调用重定向。

首先,检查这个基本示例以了解“changedAttributes”:

var ProfileModel = Backbone.Model.extend({
    defaults : {
        title : 'hi',
        name : 'there'
    }
}); 
var profile = new ProfileModel();

//Nothing changed so it returns false
console.log( profile.changedAttributes({title: 'hi'}) );

//Title changed so it return a hash with it
console.log( profile.changedAttributes({title: 'hi2'}) );

现在想出你的代码,它必须做这样的事情:

var collectedProfile = {
   firstName : this.$('.firstName').val(),
   lastName : this.$('.lastName').val(),
};

if( model.changedAttributes( collectedProfile ) ){
    //instead of listen for the changed listen directly the server response
    model.save(collectedProfile, {success : this.handlerServerResponse })
}else{
    //model did not changed do not needed to call the server
    this.doRedirect();
}


//in your view:
handlerServerResponse : function(){
   //server process completed so let's redirect
   this.doRedirect();
}