AngularJS:监视数组属性

时间:2013-12-16 22:06:06

标签: javascript arrays angularjs inheritance properties

问题在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'),但是不会更改foo(例如arr.foo = 'deedlilaa'ng-model。)

这可能是javascripts的限制吗?我的意思是当你遍历那个数组时,你只会找回对象,所以没有办法枚举foo ..

检查吸管,看看我到底是怎么回事。无论您在输入中键入什么或在控制器中执行什么操作,Watch都不会触发。

3 个答案:

答案 0 :(得分:0)

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

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

但是,如果你不关心混合数字和关联数组键,你可以将你的plunker的第37行更改为:

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

答案 1 :(得分:0)

使用:

$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);

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

答案 2 :(得分:-1)

Javascript数组不允许“字符串索引”。 arr.foo会将arr的类型从Array转换为Object