Javascript AngularJS:$watch数组中所有对象的属性

Javascript AngularJS:$watch数组中所有对象的属性,javascript,arrays,angularjs,Javascript,Arrays,Angularjs,我试图理解如何最好地在angularjs中实现以下目标 1) 我有一个对象数组: $scope.myArray = [{special:false, name:'alice'}, {special:false, name:'bob'}]; 如果myArray[0]。特殊更改为true,则使用$watch如何检测到这是由于数组的元素0发生了更改。我在$watch上读到的所有内容都是通知数组作为一个整体已更改,但无法检索已更改的数组的元素/索引。我想让它处理不同长度的阵列,因此仅仅有: $scop

我试图理解如何最好地在angularjs中实现以下目标

1) 我有一个对象数组:

$scope.myArray = [{special:false, name:'alice'}, {special:false, name:'bob'}];
如果myArray[0]。特殊更改为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)在阵列和地图方面的实际可行性。我认为这类似于问题,但我也有兴趣了解如何在字典中查看所有属性


非常感谢。

手表监听器会为您提供新值和旧值-因此您的工作是比较这两个值,看看有什么变化。由于您希望执行值比较而不是引用比较,请使用$watch并将第三个参数设置为true:

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

也许这可以帮助您回答#1:我认为对于数组,这将返回newVal和oldVal的每个数组中的项目的完整列表。然后我需要扫描每个数组并比较。特别是两者之间。只是想知道angular的某个部分是否会自动处理这个问题,这样它就会返回索引0。angular恐怕没有办法做到这一点-这样的功能会很方便,但它可能会损害性能,同时并不总是需要的。更重要的是,你怎么知道该返回什么?如中所示,您希望作为变更提供的内容(完整路径、子路径等)一致认为,在这种情况下很难指定返回值。对于数组,它可能返回子值已更改的最顶层对象的索引。对于我上面的例子#1,如果我放入$scope.$watch('myArray'),它将返回0。实际上,我认为就我的目的而言,在newVal数组上循环就足够了。