编辑:我自己实现了GitHub
我想知道,ember中是否有内置功能可以保存对象/数组的状态?在我们的应用程序中,我们为特定的Ember.ArrayController构建了自己的撤消/历史记录实现,但它似乎是错误和缓慢的(在Firefox中)。所以我想知道是否有任何东西可以取代我们的剧本。
基本上我们用它来: 用户添加,编辑,修改该数组中的元素,有时他们想要撤消/重做他们的更改。目前我们将状态数量限制为30(可能不是最佳数量)。
感谢任何想法/链接!
答案 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