好的,所以我们推出了我们的第一个Backbone JS应用程序,现在我们遇到了新问题。 显然,当我最初为评论和评论加载模型时,它们具有“created_at”属性,这些属性包含添加时间的时间戳。当我编辑注释然后执行model.sync()时,它会将“created_at”传递回服务器。现在RoR应用程序跳出来了,正如我们的Rails开发人员告诉我的那样,我不能在任何情况下都不会将“created_at”传递回服务器并且它只是为了显示而计算。
现在必须要付出代价。要么我必须破解Backbone并在sync()之前删除一些属性,或者必须在Rails端完成某些操作。
你对解决方案的建议是什么?
在任何情况下,在model.sync()期间不能传递一些属性可以做些什么?我非常感谢你的帮助。
答案 0 :(得分:1)
我试图发布到不可变属性时遇到了这个问题。 Backbone模型的问题在于,默认情况下,它们全部或全部发布。但是你可以做部分更新。为了解决这个问题,我创建了一个Backbone.Model后代,并像这样覆盖了model.save:
save : function(key, value, options) {
var attributes, opts;
//Need to use the same conditional that Backbone is using
//in its default save so that attributes and options
//are properly passed on to the prototype
if (_.isObject(key) || key == null) {
attributes = key;
opts = value;
} else {
attributes = {};
attributes[key] = value;
opts = options;
}
//Now check to see if a partial update was requested
//If so, then copy the passed attributes into options.data.
//This will be passed through to Backbone.sync. When sync
//sees that there's an options.data member, it'll use it instead of
//the standard attributes hash.
if (opts && opts.partialUpdate) {
opts["data"] = JSON.stringify(attributes);
opts["contentType"] = "application/json";
}
//Finally, make a call to the default save now that we've
//got all the details worked out.
return Backbone.Model.prototype.save.call(this, attributes, opts);
}
这允许我有选择地将我想要的属性发布到后端,如下所示:
//from the view - the GET may have delivered 20 fields to me, but I'm only interested
//in posting the two fields.
this.model.save({
field1 : field1Value,
field2 : field2Value
},{
partialUpdate : true
});
不能告诉你这是如何让我的生活变得如此简单!现在,有人可能会问为什么不只是传递changedAttributes()JSON?原因是因为在某些情况下,更改的属性仅适用于客户端,特别是用于引发对也使用该模型的视图的更改。
无论如何,试试这个......
答案 1 :(得分:1)
您可以添加到您的模型中:
attr_protected :created_at, :updated_at