假设我有一个像这样的对象数组:
$scope.data = [
{
"active": true,
"id": "4bcb19db-ec10-4de5-8ae6-b13388494651",
"name": "Owais Shah",
"username": "chekhov"
},
{
"active": false,
"id": "630d0582-1bf9-4331-9fa6-f6baa59319b2",
"name": "Tim Hunt",
"username": "one"
}
]
我可以用这个来深入观察对象:
$scope.$watch('data', function(){...}, true)
但是,在我的情况下这不是很有效,因为我有兴趣观看这些对象的唯一属性是active
。
有没有办法只观察对象内部的特定属性?像$scope.$watch('data[].active' ...)
答案 0 :(得分:1)
我认为你可以这样做:
for(var i=0,j=$scope.data.length;i<j;i++) {
$scope.$watch(data[i].active, function() { });
}
答案 1 :(得分:1)
您可以观看一个功能,该功能又会返回您的内部对象
$scope.$watch( function() {
return $scope.data.active[0];
},
function(newValue, oldValue) {
console.log('It changed!');
}
);
答案 2 :(得分:1)
您可以利用$ watch函数接受函数并返回您从数组中计算的值。例如,你可以看一下它是一个基于二进制序列0/1的数字,用于active = false或true。像这样的东西会起作用:
$scope.$watch(function() {
var value = 0, idx;
for (idx = 0; idx < $scope.data.length; idx += 1) {
value *= 2;
value += $scope.data[idx].active ? 1 : 0;
};
return value;
}, function() {
$scope.changes += 1;
$scope.status = "Changed " + $scope.changes + " times."; });
这里的jsFiddle说明了它:http://jsfiddle.net/jeremylikness/GrRtK/
您可以通过单击相同的按钮来查看它。元素第一次从true变为false或反之,更改将被注册,而后续更新不会触发监视。如果您使用下划线的映射函数将数组投影到您的数字或值来观看,它将更具可读性。