AngularJS的“有针对性”深表

时间:2014-02-06 18:43:15

标签: angularjs

假设我有一个像这样的对象数组:

$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' ...)

这样的东西

3 个答案:

答案 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或反之,更改将被注册,而后续更新不会触发监视。如果您使用下划线的映射函数将数组投影到您的数字或值来观看,它将更具可读性。