2013-02-12 69 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