Javascript 历史记录/撤消

Javascript 历史记录/撤消,javascript,ember.js,undo,Javascript,Ember.js,Undo,Edit:我已经完成了我自己的实现,该实现在 我想知道,ember中是否有一个内置功能,可以保存对象/数组的状态?在我们的应用程序中,我们为特定的Ember.ArrayController构建了自己的撤销/历史实现,但它似乎有缺陷且速度缓慢(在Firefox中)。所以我想知道是否有什么东西可以取代我们的脚本 基本上我们使用它的目的是: 用户在该数组中添加、编辑、修改元素,有时他们希望撤消/重做更改。目前,我们将状态数量限制为30(可能不是最佳数量) 任何想法/链接都将不胜感激 我实现了一个mix

Edit:我已经完成了我自己的实现,该实现在

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

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

任何想法/链接都将不胜感激

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

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

主机位于GitHub上的。可按如下方式使用,请参见:

App.obj=Ember.Object.create(Ember.Memento{
姓名:'你好',
myArray:[],
年龄: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);
附件obj.set(“年龄”,190岁);
App.obj.get('myArray').pushObjects(['a','b']);
App.obj.undo();//myArray=[1,2,3,4]
App.obj.undo();//年龄=12
App.obj.undo();//myArray=[1,2,3]
App.obj.undo();//name=‘你好’
App.obj.redo();//name='hubert'
App.obj.redo();//myArray=[1,2,3,4]
App.obj.redo();//年龄=190

解决方案本身非常棒,但是因为ember没有像updateProperties这样的东西,而没有setProperties,所以我不能对对象进行多次更改,也不能多次触发观察者。尽管您的解决方案按预期工作!谢谢!我已经更新了mixin并添加了一个
updateProperties
方法,该方法只为多个值更改添加了一个历史记录项。如果您有任何进一步的建议,请在回购协议中开立一个问题。干杯我创建了一个类似的实现,它比您的实现简单得多。我的实现是针对全局历史的,而不仅仅是针对对象。看看:)@Ignas不错!别忘了把它添加到