2013-02-12 70 views
0

我会尽量简洁地描述这一点。在我正在开发的应用程序中,骨干模型已保存,然后可以稍后进行编辑。目前,我已经设置了功能完全动态的地方。如何编辑骨干模型并等待保存

例子: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没有立即保存到以前的模型?

我着眼于使用香草物体来追踪变化,但我认为必须有一个更好的方式,与典型的骨干模式更接近。

当然,我试过new NamedBackboneModel(options.previousModel.toJSON()),但由于模型上的嵌套集合没有按预期工作,并且需要一些体系结构更改。

我想在previousModel克隆将工作,但我没有任何运气与这种方法。感谢您的帮助,请让我知道是否需要提供更多的说明。

+1

做model.set(“属性”,值)将不会保存到数据库,让您可以随时做一个集合恢复旧模式取决于用户是否决定不保存? – 2013-02-12 05:22:43

回答

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'); } 
    } 
}, 
1

我想你应该通过{silent: true}当你打电话model.set()

然后,您可以通过调用model.previousAttributes()来获取以前值的列表以获取所有先前的属性。或model.previous("name")以获取特定属性。

当您想放弃以前的属性时,可以调用model.change()来调用'更改'事件。

当您想要保存时,您可以model.save({silent:false})这将保存并丢弃以前的属性,或通过{silent:true}将保持以前的更改。

+0

这对大多数情况都适用,但对于嵌套集合,它是自包含的作为自己的对象。这是我在这里处理的挑战。我正在保存它的副本,我将在view.remove()函数中恢复所有内容。感谢您的贡献。 – Brandon 2013-02-12 15:44:53