EmberJS历史/撤消

时间:2012-05-11 13:31:31

标签: javascript ember.js undo

编辑:我自己实现了GitHub

我想知道,ember中是否有内置功能可以保存对象/数组的状态?在我们的应用程序中,我们为特定的Ember.ArrayController构建了自己的撤消/历史记录实现,但它似乎是错误和缓慢的(在Firefox中)。所以我想知道是否有任何东西可以取代我们的剧本。

基本上我们用它来: 用户添加,编辑,修改该数组中的元素,有时他们想要撤消/重做他们的更改。目前我们将状态数量限制为30(可能不是最佳数量)。

感谢任何想法/链接!

1 个答案:

答案 0 :(得分: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