Javascript 在Angular JS中重写$digest和$watch

Javascript 在Angular JS中重写$digest和$watch,javascript,performance,angularjs,user-interface,angular-ui,Javascript,Performance,Angularjs,User Interface,Angular Ui,有人能建议我如何创建一个服务来覆盖默认的$watch和$digest循环吗 我的要求是$watch一个带有侦听器的作用域对象,侦听器函数应该有4个参数,@param1-newObject、@param2-oldObject、@param3-Exact-attribute which changed、@param4-该对象中的属性对已更改属性的继承权 所需:- $scope.$watch('objectName', function(param1,param2,param3,param4){

有人能建议我如何创建一个服务来覆盖默认的$watch和$digest循环吗

我的要求是$watch一个带有侦听器的作用域对象,侦听器函数应该有4个参数,@param1-newObject、@param2-oldObject、@param3-Exact-attribute which changed、@param4-该对象中的属性对已更改属性的继承权

所需:-

$scope.$watch('objectName', function(param1,param2,param3,param4){
   //log param3 and param4 in a stack for later use. 
   //Note:- I dont want to log entire changed object since its too big.
}, true);
注意:-现在我们可以深入观察一个对象,但是监听器将为我们提供两个对象,旧对象和新对象。我只想更改确切的属性

我们将非常感谢您的帮助。请参考下面的链接了解我的完整问题


我认为您可能可以创建一个撤销系统,该系统使用某种分类系统来处理各种类型的撤销,并采用更面向事件的方法。我重点介绍了您关于为每次击键迭代整个对象的评论,因此将从这里开始

我假设您不需要为输入上的每一次击键更新服务器,在这种情况下,您不需要在焦点中查看特定输入的关键事件以外的任何内容。将CTRL+Z绑定到文档时,请确保在输入处于焦点时不会发生全局操作

以下场景基于最简单的UI操作来跟踪…仅更新字段

在输入的焦点上,您将立即获取其当前模型值的副本,并将其存储为值,以便稍后完全撤消ng模型

当处于焦点时,CTRL+Z将绑定到该输入,击键事件可以在非常局部的级别上撤消,而不影响在更高级别上观看的任何需要。在模糊上取消绑定该输入的关键点事件

在输入模糊时,您将能够
$emit
一个
更新事件
,您可以像“字段更新”一样跟踪该事件。将旧存储值(包含
ng model
和update类别的对象)发送到跟踪服务,该服务侦听更新并将更新推送到撤消数组中

当用户现在点击“撤消”时,服务将查看更新类型并更改与存储的字段名关联的对象的值,并从队列中删除最后存储的项

我只使用jQuery为UI做了类似的事情,该UI被设置为创建和管理带有绝对定位元素的网页布局,以及插入和更新内容

我只从用户级输入开始,假设没有创建或删除新的数据对象。这些可能由$.watch监视数组长度来处理。通过只观察长度,您不必迭代包含的每个对象的每个属性来找出发生了什么变化

对于所有这些,一个有用的跟踪属性是
$$hashKey
属性,angular将该属性提供给它在所有范围内接触的每个对象。使用haskey可以帮助映射数组长度的变化以发现差异。我还没有看完这一节的全部内容

希望事件驱动的输入跟踪概念能有所帮助。至少在用户输入级别,它将使用$watch节省大量开销


此外,angular最近在1.2中添加了一个较浅的侦听器
$watchCollection
。我还没有使用过它,但它确实减轻了开销,因为它的用例可能无法保证进行全面监视

在我的回答中检查撤销/重做实现。感谢Nikos,它确实解决了这个问题:)