我在$ 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中实现撤消/重做的最佳方法是什么?
注意: -
angular-history不适合我的需要因为我想要观察对象的所有属性,它们也可能包含其他对象和数组。
我肯定看整个$ rootScope也不是一个好主意,但我的目标是构建一个具有多个网格的UI,拖放,可能包含表单,元素可以删除。因此,我想构建一个整体解决方案来堆叠更改并在CTRL + Z上撤消它。想象一下复制桌面版的Photoshop。
答案 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是您正在寻找的。 p>
https://github.com/azazdeaz/LazyJsonUndoRedo
自述文件:
A&#39;跌入&#39;具有嵌套javascript对象的自动撤消/重做功能的历史处理程序,使用ES6 Object.observe()或Polymer shim。