我多次调用set
方法并更改多个属性。然后我想使用{patch: true}
将更改的数据发送到服务器。
我可以使用model.save(attrs, {patch: true});
,但我不知道attrs
。我无法使用model.toJSON()
(不需要的字段)或model.changedAttributes()
(仅限最后一组)来获取attrs
。
我该怎么做?
答案 0 :(得分:2)
可选地,可以传入外部属性哈希,返回该哈希中与模型不同的属性。
因此,您可以在开始修改之前尝试使用toJSON
缓存模型的状态。完成修改后,将新状态传递给changedAttributes
方法以检索已更改的属性哈希,然后发送修补程序请求。像
var oldAttrs = model.toJSON();
// ...do modifications here
var changedAttrs = model.changedAttributes(oldAttrs);
dataTosend = model.pick(_.keys(changedAttrs));
model.save(dataTosend, {patch: true});
答案 1 :(得分:0)
绑定模型的监听器
如果你在视图中设置值,那么监听器应该是(更好地在初始化函数中写入)
this.listenTo(this.model, "change", this.onModelValueChange);
你的听众功能
onModelValueChange: function(model, args) {
model.save(args.changed, {patch: true});
}
答案 2 :(得分:0)
虽然TJ has the right answer,但我有更好的方法来实现他的建议。
我更喜欢在应用程序的开头或视图的初始化中保留模型的主副本,而不是制作属性的原始克隆。
this.master = this.model.clone();
// ... then changes are made to this.model
准备保存时,使用主模型比较属性并直接检索更改。
var changes = this.master.changedAttributes(this.model.attributes);
if (changes !== false) this.model.save(changes, { patch: true });
有了这个,您可以完全跳过dataTosend = model.pick(_.keys(changedAttrs))
,因为changes
已经是与主模型初始状态的所有差异的对象。
如果是在模型保存后重新使用的视图:
var View = Backbone.View.extend({
initialize: function() {
this.updateMaster();
},
saveChanges: function() {
var changes = this.master.changedAttributes(this.model.attributes);
if (changes !== false) {
this.model.save(changes, {
patch: true,
context: true,
success: this.updateMaster
});
}
},
updateMaster: function() {
this.master = this.model.clone();
},
});