EmberJS历史/撤消

Ign*_*nas 12 javascript undo ember.js

编辑:我已经在GitHub上创建了自己的实现

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

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

任何想法/链接表示赞赏!

pan*_*atz 12

我已经实现了一个mixin"Memento",它跟踪mementoProperties数组中定义的属性的变化.它支持普通属性和数组属性.

基本思想如下:当mixin初始化时,它将自身注册为属性更改的观察者.属性更改会向memento数组添加一个新项,该项表示所做更改的历史记录.调用undo将属性设置为更改之前的状态.redo分别重置该值.

混入在GitHub上托管烬,纪念品.它可以如下使用,请参阅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
Run Code Online (Sandbox Code Playgroud)

  • 我创建了一个类似的实现,比你的更简单.我的实现是针对全局历史而不仅仅是对象.看看它https://github.com/ignasbernotas/ember-history/ :) (3认同)