2014-02-25 89 views
3

我有一個從具有綁定到UI(首選項面板)的許多屬性的JSON對象創建的模型。我希望允許用戶更新他們的偏好,但我還需要一種方法讓他們在對UI進行更改後恢復對模型的更改。我看到很多使用Ember-Data的例子,但我們沒有使用它;我也沒有在Ember文檔中看到任何明顯的模式/方法。在沒有Ember-Data的模型中是否有常用的模式來實現「回滾」?在沒有Ember-Data的情況下恢復模型更改

回答

2

這真的取決於您的模型的結構。我編寫了自己的Ember持久性庫,並讓每個屬性都有一個計算屬性(如Ember-Data)。從那裏,我在每個模型中有兩個哈希,分別爲oldPropertiesnewProperties。我使用這兩個串聯閱讀,並只寫入newProperties。這樣我可以隨時恢復到oldProperties,如果有必要。

底線是Ember本身不會爲您存儲舊的屬性值。您將編寫自己的自定義邏輯來存儲舊值並在需要時進行恢復。

+1

我結束了與類似的解決方案。我將我的Singleton模型標記爲Freezable和Copyable。然後在初始化時創建模型的兩個實例;一個是Singleton返回的正常實例,另一個是原始值(或保存成功後的值)。我還向觀察者添加了感興趣的屬性並追蹤他們是否改變。如果我需要撤消未保存的更改,則可以調用revert()方法來僅複製已更改的屬性。 – Geoff

+0

這很聰明。我永遠不會想到凍結對象。真高興你做到了。 – GJK

0

對我而言,有效的方法是克隆模型,然後在用戶取消編輯時恢復到克隆版本。

在路線

listEditController.set('clonedModelContent', Ember.copy(modelContent)); 

然後在控制器的取消行動:

close: function() { 
    Ember.setProperties(@get('model'), @get('clonedModelContent')); 
    // navigate somewhere else 
} 

模式可能的情況下,被還原您不想修改模型直到更改「接受」。在這種情況下,您可以將克隆設置爲控制器的屬性,並且在保存時複製這些屬性,取消將簡單地離開,基本上放棄克隆對象中的更改。

希望這會有所幫助。

0

我喜歡在模型上使用rollbackAttributes()方法。

import Ember from 'ember'; 

export default Ember.Component.extend({ 
actions: {   
    cancelEdit: function() { 
     var model = this.get('objectBeingEdited'); 
     model.rollbackAttributes(); 
     this.toggleProperty('isEditing'); 
     } 
    } 
}); 
+0

這是一個特定於燼數據的函數,因爲我們沒有使用DS,所以它不適用於我們。 – Geoff

相關問題