2013-11-26 50 views
0

我建立这个代码:如何查看AngularJS中数组中项目数量的变化?

$scope.$watch('grid.view.length', function() { 
     if ($scope.grid.view != null) { 
      var a = $scope.grid.view.length; 
      var pane = $('.scroll-pane').jScrollPane(); 
      pane.data('jsp').reinitialise(); 
     } 
    }) 

grid.view是一个数组。我所需要做的就是查看元素数量是否发生了变化,但是当元素内部的元素数量发生变化时,这似乎不会触发手表。我做错了吗?

Maxim的评论听起来像是一个解决方案,但我现在还不确定。最好是设置一个$ scope变量来保存长度并观察它。我担心它是否做了很多深入的比较,那么这可能是一个性能问题。注意grid.view是相当大的。

回答

1

使用标志true做深手表:

尝试:

$scope.$watch('grid.view.length', function() { 
     if ($scope.grid.view != null) { 
      var a = $scope.grid.view.length; 
      var pane = $('.scroll-pane').jScrollPane(); 
      pane.data('jsp').reinitialise(); 
     } 
    }, true) 
+0

如果我使用“true”,那么我是否还需要.length?也可以将$ scope变量设置为$ scope.abc = grid.view.length;然后看那个? –

+0

我会使用'grid.view.length'。因为你只想在长度变化时触发,而不是在内容上触发。它阻止了你额外的观察循环(当然,性能) –

0

您的关注是合理的。从文档:

要保存该对象的值供以后比较,使用angular.copy函数。这也意味着观看复杂的选项会产生不利的记忆和性能影响。

使用另一个只包含长度的范围变量对您的情况是一种矫枉过正。

$watch也接受函数作为参数。返回值的变化会触发对听众的呼叫:

$scope.$watch(function($scope){ 
    return grid.view.length; 
},function(newValue, oldValue){ 
    /* do something */ 
    console.log("yeah! "+newValue); 
}); 
相关问题