AngularJS:观察数组属性

AngularJS : watch array property

本文关键字:属性 数组 观察 AngularJS      更新时间:2023-09-26

问题在这里显而易见http://plnkr.co/edit/ZphAKvZeoVtuGFSEmOKg?p=preview

假设你有一个看起来像的阵列

var arr = [
 {
   'a': "123",
   'b': "654"
 },
 {
   'a': "456",
   'b': "321"
 }
];
arr.foo = 'bar';

当您更改$watch对象内部的某些内容时(例如arr[0].a = 'hoopidoo'),CCD_1激发,但当更改foo时(例如,arr.foo = 'deedlilaa'或通过ng-model),它不会

可能是javascript限制吗?我的意思是,当你迭代该数组时,你只会得到对象,所以没有办法枚举foo。。

不管怎样,看看我在干什么。无论你在输入中键入什么或在控制器中做什么,手表都不会启动。

观察Array对象属性(与特定键上的对象相反)的唯一方法是显式$watch它们:

$scope.$watch('arr.param', function(newVal, oldVal) {
   // Some code
}
arr.param = 'foobar'

然而,如果你不在乎混合数字和关联数组键,你可以把plunker的第37行改成这样:

$scope.arr['param'] = "abc";

使用:

$scope.$watchCollection

特别是,您可以使用$watchColletion查看范围内的变量,并更新您的按钮或任何您需要的内容。

$scope.$watchCollection(function () {
    if ($scope.myForm)
        return $scope.myForm;
}, function () {
   if ($scope.myForm)
   if (($scope.myForm.$invalid == true))
          $scope.formValidityChange(true);
    else
        $scope.formValidityChange(false);
}, true);

这将检查表单中更改的所有变量,并更新控制器。我想你也可以通过比较这两个对象来检查发生了什么变化,也许这会更困难。

Javascript数组不允许使用"字符串索引"。CCD_ 8将CCD_ 9的类型从CCD_。