【问题标题】:EmberJS History/UndoEmberJS 历史/撤消
【发布时间】:2012-05-20 02:37:24
【问题描述】:

编辑:我在GitHub上做了我自己的实现

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

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

感谢任何想法/链接!

【问题讨论】:

    标签: javascript ember.js undo


    【解决方案1】:

    我已经实现了一个混合“Memento”,它跟踪mementoProperties 数组中定义的属性的变化。它支持 normal 属性以及 array 属性。

    基本思想如下:当 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
    

    【讨论】:

    • 解决方案本身很棒,但是因为 ember 没有 updateProperties 而不是 setProperties,所以我不能对对象进行多次更改,也不能多次触发观察者。尽管您的解决方案按预期工作!非常感谢!
    • 我已经更新了 mixin 并添加了一个 updateProperties 方法,该方法只添加了 1 个历史项目以进行多个值更改。如果您有任何进一步的建议,请在 repo 中打开一个问题。干杯!
    • 我创建了一个类似的实现,只是比你的简单得多。我的实现是针对全球历史的,而不仅仅是针对一个对象。看看github.com/ignasbernotas/ember-history :)
    • @Ignas 不错!不要忘记将其添加到github.com/emberjs/ember.js/wiki/Modules
    猜你喜欢
    • 2011-08-20
    • 2020-03-24
    • 1970-01-01
    • 2014-04-14
    • 2021-06-25
    • 2015-01-15
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多