2013-07-07 100 views
19

我有一個模型,可以通過某個視圖進行編輯;但是,在視圖的底部,用戶應該可以選擇保存或放棄所有更改。這意味着您需要存儲所有要對模型進行的更改的列表,然後僅在單擊「保存」按鈕後進行更改。這聽起來不必要的複雜,我想出了一種替代方法,即創建模型的克隆並在視圖中對其進行更改。然後,如果用戶點擊「保存」,刪除舊模型並將其替換爲新的模型,否則放棄克隆的模型。如何克隆骨幹模型

這是一種可接受的方法,如果是的話,我該如何實現克隆過程?

這將等於從服務器再次獲取數據(但似乎不需要額外的HTTP請求)。

+1

但是,爲什麼你需要克隆模型呢?無論如何,你可以提取所有值保存點擊並保存;否則,如果你想知道在保存時是否有任何值被改變,只需實現'Model View Binding' .. – Pawan

回答

25

您可以使用clone方法。下面簡單的例子:

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     this.realModel = this.model; 
     this.model = this.realModel.clone(); 
    }, 
    onSave: function() { 
     this.realModel.set(this.model.attributes); 
    } 
}); 

你也可以做的東西有點不同:

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     // save the attributes up front, removing references 
     this._modelAttributes = _.extend({}, this.model.attributes); 
    }, 
    onSave: function() { 
     // revert to initial state. 
     this.model.set(this._modelAttributes); 
    } 
}); 
+0

是'this.realModel.set(this.model.attributes);'絕對安全?我只是在想'這個'的值可能會不同(儘管我認爲'this'指的是'Backbone.Model',我不確定) –

+0

另外,抱歉我的無知,但是什麼是重點line'var Model = Backbone.Model.extend({});' - 我沒有看到你在任何地方使用'Model'。或者你只是做了一個例子,並建議你在創建一個實例時將'Model'作爲視圖的模型? –

+0

我打算用模型初始化視圖,但我沒有。你可以忽略'var Model'。 'this'是'this.realModel.set(this.model.attributes)'指的是視圖,因爲它是當前的上下文。 – kalley

0

你可以給Backbone.Memento一試。

如果你不想使用它沒有問題。但是,您可以從代碼庫中瞭解如何完成該任務。

+0

是否有理由使用上述卡爾利的方法,或者你只是提供一個替代方案? –

+0

不,這是一種替代方案。它非常小,並提供一堆其他功能。這就是我建議的原因。 – Rifat

0

我通常用視圖上的對象緩存來解決這個問題。這樣我就不會爲模型/視圖管理添加任何不必要的開銷。如果用戶在未保存的情況下關閉視圖,則會自然放棄。

var Model = Backbone.Model.extend({ 
    'title': 'Hello' 
}); 

var View = Backbone.View.extend({ 
    initialize: function() { 

     // Holds temporary values until save 
     this.cache = {}; 

    }, 
    onTitle: function() { 
     this.cache.title = 'World'; 
    }, 
    onSave: function() { 
     this.model.set(this.cache); 
    } 
});