在Angular JS中撤消重做

时间:2013-11-06 16:44:34

标签: javascript angularjs

我在$ rootScope中有一个大对象(比如> 100个对象,每个对象/数组都有层次结构),我想用deepWatching观察整个$ rootScope(即将$ watch的第3个参数转换为TRUE) 。

但问题是,$ watch返回2个对象(即一个Old RootScope和Modified RootScope)。然后我必须检查$ rootScope及其层次结构中对象的哪个属性被更改为将其推入堆栈。

我们是否有一个简单的方法可以在观看$ scope时更改确切的属性?

$scope.$watch($rootScope, function(oldObj, newObj){

   //all I want here is exactly what attribute changed, NOT entire objects!

}, true);

或者,我可以在对象的每个属性上添加监视,但它看起来非常昂贵。

在角度js中实现撤消/重做的最佳方法是什么?

注意: -

  1. angular-history不适合我的需要因为我想要观察对象的所有属性,它们也可能包含其他对象和数组。

  2. 我肯定看整个$ rootScope也不是一个好主意,但我的目标是构建一个具有多个网格的UI,拖放,可能包含表单,元素可以删除。因此,我想构建一个整体解决方案来堆叠更改并在CTRL + Z上撤消它。想象一下复制桌面版的Photoshop。

5 个答案:

答案 0 :(得分:5)

撤消/重做基于command pattern。是的,会有很多手表;如此丰富的功能并不便宜。

只是为了它的乐趣,这是一个简单的(但非常有用和可扩展的)实现:http://jsfiddle.net/sYc4e/1/

命令是知道如何应用和回滚更改的对象的接口:

function XxxCommand() {
    // implementation specific
}
Command.prototype.execute = function() {
    // implementation specific
};
Command.prototype.rollback = function() {
    // implementation specific
};

用法:用指令装饰<input>

<input name="name" undoable ng-model="data.name" />

用一个元素(例如<form>)用undo-support指令包装它们:

<form undo-support>

undoable的链接功能侦听<input>中的更改并使用undoableSupport注册命令。 undoableSupport的控制器跟踪命令列表。

答案 1 :(得分:4)

还有一个名为Angular-Chronicle的撤消/重做库。至少对我自己来说,这是一个比角度历史更好的选择。

答案 2 :(得分:2)

图书馆angular-history提供撤消/重做。

目前尚未维护。最近的分叉似乎是https://github.com/domoritz/angular-history

答案 3 :(得分:0)

而不是观察整个$ rootScope,或者对于任何一个包含大量项目的对象,而这些项目又包含许多要求你在每个摘要上遍历嵌套数组的项目,我会使用一个数组(使用它作为一个队列)应用于原始数据模型的变化和一个指向该队列中当前位置的变量。

我会将该数组和该变量放在服务中,然后在undo / redo发生时更改该索引。您可以从需要响应这些更改的任何地方观察该变量,例如指令

答案 4 :(得分:0)

我认为LazyJsonUndoRedo是您正在寻找的。

https://github.com/azazdeaz/LazyJsonUndoRedo

自述文件:

  

A&#39;跌入&#39;具有嵌套javascript对象的自动撤消/重做功能的历史处理程序,使用ES6 Object.observe()或Polymer shim。

http://dailyjs.com/2014/07/18/lazy-json-undo/