我有一個模型,可以通過某個視圖進行編輯;但是,在視圖的底部,用戶應該可以選擇保存或放棄所有更改。這意味着您需要存儲所有要對模型進行的更改的列表,然後僅在單擊「保存」按鈕後進行更改。這聽起來不必要的複雜,我想出了一種替代方法,即創建模型的克隆並在視圖中對其進行更改。然後,如果用戶點擊「保存」,刪除舊模型並將其替換爲新的模型,否則放棄克隆的模型。如何克隆骨幹模型
這是一種可接受的方法,如果是的話,我該如何實現克隆過程?
這將等於從服務器再次獲取數據(但似乎不需要額外的HTTP請求)。
我有一個模型,可以通過某個視圖進行編輯;但是,在視圖的底部,用戶應該可以選擇保存或放棄所有更改。這意味着您需要存儲所有要對模型進行的更改的列表,然後僅在單擊「保存」按鈕後進行更改。這聽起來不必要的複雜,我想出了一種替代方法,即創建模型的克隆並在視圖中對其進行更改。然後,如果用戶點擊「保存」,刪除舊模型並將其替換爲新的模型,否則放棄克隆的模型。如何克隆骨幹模型
這是一種可接受的方法,如果是的話,我該如何實現克隆過程?
這將等於從服務器再次獲取數據(但似乎不需要額外的HTTP請求)。
您可以使用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);
}
});
是'this.realModel.set(this.model.attributes);'絕對安全?我只是在想'這個'的值可能會不同(儘管我認爲'this'指的是'Backbone.Model',我不確定) –
另外,抱歉我的無知,但是什麼是重點line'var Model = Backbone.Model.extend({});' - 我沒有看到你在任何地方使用'Model'。或者你只是做了一個例子,並建議你在創建一個實例時將'Model'作爲視圖的模型? –
我打算用模型初始化視圖,但我沒有。你可以忽略'var Model'。 'this'是'this.realModel.set(this.model.attributes)'指的是視圖,因爲它是當前的上下文。 – kalley
你可以給Backbone.Memento一試。
如果你不想使用它沒有問題。但是,您可以從代碼庫中瞭解如何完成該任務。
是否有理由使用上述卡爾利的方法,或者你只是提供一個替代方案? –
不,這是一種替代方案。它非常小,並提供一堆其他功能。這就是我建議的原因。 – Rifat
我通常用視圖上的對象緩存來解決這個問題。這樣我就不會爲模型/視圖管理添加任何不必要的開銷。如果用戶在未保存的情況下關閉視圖,則會自然放棄。
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);
}
});
但是,爲什麼你需要克隆模型呢?無論如何,你可以提取所有值保存點擊並保存;否則,如果你想知道在保存時是否有任何值被改變,只需實現'Model View Binding' .. – Pawan