0

谁能建议我如何创建一个服务来覆盖 Angular js 默认的 $watch 和 $digest 循环?

我的要求是 $watch 一个带有监听器的范围对象,监听器函数应该有 4 个参数,@param1 - newObject,@param2 - oldObject,@param3 - 更改的确切属性,@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);

注意:- 现在我们可以深入观察一个对象,但监听器会为我们提供 2 个对象,旧对象和新对象。我想要的只是改变确切的属性。

任何帮助将不胜感激。有关我的完整问题,请参阅以下链接。

在 Angular JS 中撤消重做

4

1 回答 1

0

我认为您可能可以创建一个撤消系统,该系统使用某种分类系统来处理各种类型的撤消以及更加面向事件的方法。我专注于您对每次击键迭代整个对象的评论,因此将从那里开始

我假设您没有为输入上的每次击键更新服务器,在这种情况下,除了特定输入的键事件处于焦点时,您不需要查看任何其他内容。当您将 CTRL +Z 绑定到文档时,请以在输入处于焦点时不会发生任何全局性的方式来执行此操作。

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

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

在焦点集中时,CTRL+Z 将绑定到该输入,并且击键事件可以在非常本地的级别上撤消,而不会影响在更高级别上观看的任何需要。在模糊时取消绑定该输入的键事件。

在输入模糊时,您可以将其$emit作为update event“字段更新”之类的类别进行跟踪。将旧的存储值(包含ng-model更新类别的对象)发送到跟踪服务,该服务侦听更新并将更新推送到撤消数组中。

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

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

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

对所有这些都有帮助的跟踪属性是$$hashKeyangular 赋予它在所有范围内触及的每个对象的属性。使用 haskey 可以帮助映射数组长度变化以发现差异。我还没有读完这部分的所有内容。

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

Angular 最近还添加了一个较浅的侦听器$watchCollection,在 1.2 中添加了。还没有使用它,但肯定会减轻开销,因为它的用例可能不需要完整的手表

于 2013-11-11T16:09:00.193 回答