我会尽可能简洁地描述这一点。在我正在开发的应用程序中,Backbone模型已保存,然后可以在以后进行编辑。目前,我已将其设置为完全动态的功能。
示例:this.model.set('attribute', value)
标准的东西。这是问题所在。客户希望在用户明确单击保存并完成按钮之前不保存更新的模型。
以前,我使用此模式进行编辑:
this.model = options.previousModel || new NamedBackboneModel({
id: this.model.get('id'),
attr: otherModel.get('attr')
});
我已经将该示例中的属性和模型名称设为通用,但它运行良好。在整个视图中,我会使用model.set('attr' value)
,这是完美的。
我可以在不立即将它们保存到以前的模型的情况下对previousModel进行编辑的最佳方法是什么?
我查看了使用vanilla对象来跟踪更改,但我认为必须有一种更好的方式,更典型的Backbone模式。
当然,我尝试了new NamedBackboneModel(options.previousModel.toJSON())
,但由于模型上的嵌套集合没有按预期工作,需要进行一些体系结构更改。
我认为previousModel上的克隆会起作用,但我也没有任何运气。感谢您的帮助,如果我需要提供更多说明,请告诉我。
答案 0 :(得分:1)
我认为您应该在致电{silent: true}
时通过model.set()
。
然后,您可以通过调用model.previousAttributes()
来检索以前的值列表,以获取所有以前的属性。或model.previous("name")
获取特定属性。
如果要放弃以前的属性,可以调用model.change()
来调用“更改”事件。
如果要保存,可以model.save({silent:false})
保存并放弃以前的属性,或者通过{silent:true}
保留以前的更改。
答案 1 :(得分:0)
我最终使用了一些方法来完成这项工作。我添加了存储并将函数恢复到模型中,如下所示:
store: function() {
this._storedAttributes = _.clone(this.attributes);
this._storedCollection = _.clone(this.collection().toJSON());
},
revert: function() {
if (this._storedAttributes) {
this.set(this._storedAttributes, {
silent: true
});
this.collection.remove(this.collection.models, { silent: true });
this.collection.reset(this._storedCollection, { silent: true });
// For syncing local storage up the chain
if(!this.isNew()) { this.trigger('change'); }
}
},