2012-05-11 53 views
12

編輯:我做了我自己的實現,這是對GitHubEmberJS歷史/撤銷

我想知道,是否有一個內置的灰燼功能,允許保存對象/數組的狀態?在我們的應用程序中,我們爲特定的Ember.ArrayController構建了自己的撤銷/歷史實現,但它似乎是buggy和緩慢的(在Firefox中)。所以我想知道是否有什麼東西可以替代我們的腳本。

基本上我們將它用於: 用戶添加,編輯,修改該數組中的元素,有時他們想要撤銷/重做其更改。目前我們將狀態數量限制爲30(可能不是最佳數量)。

任何想法/鏈接表示讚賞!

回答

12

我已經實現了一個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 
+0

解決方案本身是真棒,但是因爲燼沒有像updateProperties代替setProperties方法,我不能讓對象多次更改,而不是觸發觀察家多倍。儘管您的解決方案按預期工作!非常感謝! – Ignas

+1

我已經更新了mixin並添加了一個'updateProperties'方法,該方法僅爲多個值更改添加了1個歷史記錄。如果您有任何進一步的建議,請在回購中打開一個問題。乾杯! – pangratz

+3

我已經創建了一個類似的實現,只是比你更簡單。我的實現不僅僅針對一個對象,而是針對全局歷史。檢查出來https://github.com/ignasbernotas/ember-history/ :) – Ignas