问题在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都不会触发。
答案 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
。