2013-11-26 48 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); 
}); 
相關問題