【问题标题】:AngularJS : $watch property on all objects in arrayAngularJS:数组中所有对象的 $watch 属性
【发布时间】:2014-08-27 22:37:44
【问题描述】:

我正在尝试了解如何最好地在 angularjs 中实现以下目标。

1) 我有一个对象数组:

$scope.myArray = [{special:false, name:'alice'}, {special:false, name:'bob'}];

如果 myArray[0].special 更改为 true,使用 $watch 我如何检测到这是因为数组的元素 0 发生了变化。我在 $watch 上阅读的所有内容都涉及通知整个数组已更改,但无法检索已更改的数组的元素/索引。我想让它处理不同长度的数组,所以仅仅拥有是不够的:

$scope.watch('myArray[0].special')

2) 我有一本字典:

$scope.myValues = {id1:{special:false, name:'alice'}, id2:{special:false, name:bob'}};

一个类似的问题 - 如果我要将 myValues.id1.special 更改为 true,我怎样才能获得相应的名称字段(或知道它是 id1)?

我非常感谢您在此处提供有关最佳实践的任何帮助和指导,以及 angularjs 和 $watch(或 $watchcollection)在数组和地图方面的实际可能。我认为这类似于问题AngularJS : Watch array of objects and animate the changed property,但我也有兴趣了解如何查看字典中的所有属性。

非常感谢。

【问题讨论】:

标签: javascript arrays angularjs


【解决方案1】:

监视侦听器为您提供 newValue 和 oldValue - 因此您的工作是比较两者以了解发生了什么变化。由于您希望执行值而不是引用比较,请使用 $watch 并将第三个参数设置为 true:

$scope.$watch( 'myObject', function( newVal, oldVal ){
    // Compare newVal and oldVal here to see what has changed.
}, true);

【讨论】:

  • 我认为对于数组,这将返回每个数组中 newVal 和 oldVal 的完整项目列表。然后我需要扫描每个数组并比较两者之间的 .special 。只是想知道这是否由 angular 的某些部分自动处理,以便它返回索引 0。
  • 恐怕 Angular 无法做到这一点 - 这样的功能会很方便,但它可能会损害性能,但并不总是需要。更重要的是,假设知道要返回什么?如,您希望作为更改提供的内容(完整路径、子路径等)
  • 同意在这种情况下很难指定返回值。对于数组,也许它可以返回子值已更改的最顶层对象的索引。对于我上面的案例 #1,如果我输入 $scope.$watch('myArray'),它将返回 0。实际上,我认为就我的目的而言,只需遍历 newVal 数组就足够了。
猜你喜欢
  • 2017-11-22
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2017-11-08
  • 2013-08-10
  • 2018-11-14
相关资源
最近更新 更多