H W*_*H W 10 javascript arrays data-binding angularjs
给定一个数组sourceArray我想创建一个targetArray取决于第一个的条目.这意味着创建的Array应包含每个源条目的条目,并在sourceArray更改时更新.但是,修改targetArray应该永远不会更新源.
这种Plunker的工作方式只要sourceArray是静态的.一旦你开始修改源条目,它显然不会正确更新目标,因为我缺乏适当的数据绑定机制.
我是否需要targetArray通过观察手动更新sourceArray或者是否有任何由Angular实现的单向数据绑定机制,我可以使用它来保持两个数组同步?
你应该使用$watch. 然后添加必要的功能。
$watch(watchExpression, 监听器, [objectEquality]); 注册一个侦听器回调,以便在 watchExpression 发生更改时执行。
每次调用 $digest() 时都会调用 watchExpression,并且应该返回将要监视的值。(当使用相同的输入多次执行时,watchExpression 不应更改其值,因为它可能会被 $digest() 执行多次。也就是说,watchExpression 应该是幂等的。)仅当当前 watchExpression 的值和之前对 watchExpression 的调用不相等(初始运行除外,请参见下文)。不等式是根据引用不等式确定的,通过 !== Javascript 运算符进行严格比较,除非 objectEquality == true (见下一点) 当 objectEquality == true 时,watchExpression 的不等式根据 angular.equals 函数确定。为了保存对象的值以供以后比较,使用了 angular.copy 函数。因此,这意味着观看复杂的对象会对内存和性能产生不利的影响。由于 angular.copy 的限制,不应将其用于监视属于或包含 File 对象的对象的更改。监视侦听器可能会更改模型,这可能会触发其他侦听器触发。这是通过重新运行观察程序直到没有检测到任何变化来实现的。重新运行迭代限制为 10 次,以防止无限循环死锁。如果您希望在调用 $digest 时收到通知,您可以注册一个不带侦听器的 watchExpression 函数。(准备好多次调用 watchExpression,因为如果检测到更改,它将在单个 $digest 周期中执行多次。)
在观察程序注册到作用域后,监听器 fn 被异步调用(通过 $evalAsync)来初始化观察程序。在极少数情况下,这是不希望的,因为当 watchExpression 的结果没有更改时调用侦听器。要在侦听器 fn 中检测这种情况,您可以比较 newVal 和 oldVal。如果这两个值相同 (===),则由于初始化而调用侦听器。