我已經實現了一個mixin「Memento」,它跟蹤mementoProperties
數組中定義的屬性的更改。它支持正常屬性以及數組屬性。
其基本思想如下:當mixin初始化時,它將自己註冊爲觀察者以查看屬性更改。屬性更改會向memento
數組添加一個新項目,該數組表示所做更改的歷史記錄。調用undo
將屬性設置爲更改之前的狀態。 redo
分別重置該值。
mixin託管在GitHub上ember-memento。它可以用來如下,請參閱http://jsfiddle.net/pangratz666/9fa95/:
App.obj = Ember.Object.create(Ember.Memento, {
name: 'hello',
myArray: [],
age: 12,
mementoProperties: 'name age myArray'.w()
});
App.obj.get('myArray').pushObject(1);
App.obj.get('myArray').pushObject(2);
App.obj.get('myArray').pushObject(3);
App.obj.set('name', 'hubert');
App.obj.get('myArray').pushObject(4);
App.obj.set('age', 190);
App.obj.get('myArray').pushObjects(['a', 'b']);
App.obj.undo(); // myArray = [1,2,3,4]
App.obj.undo(); // age = 12
App.obj.undo(); // myArray = [1,2,3]
App.obj.undo(); // name = 'hello'
App.obj.redo(); // name = 'hubert'
App.obj.redo(); // myArray = [1,2,3,4]
App.obj.redo(); // age = 190
解決方案本身是真棒,但是因爲燼沒有像updateProperties代替setProperties方法,我不能讓對象多次更改,而不是觸發觀察家多倍。儘管您的解決方案按預期工作!非常感謝! – Ignas
我已經更新了mixin並添加了一個'updateProperties'方法,該方法僅爲多個值更改添加了1個歷史記錄。如果您有任何進一步的建議,請在回購中打開一個問題。乾杯! – pangratz
我已經創建了一個類似的實現,只是比你更簡單。我的實現不僅僅針對一個對象,而是針對全局歷史。檢查出來https://github.com/ignasbernotas/ember-history/ :) – Ignas