2016-08-24 65 views
3

我有一些功能在我的控制器和一個手錶,隱藏和顯示我的網頁上的一些元素。角度手錶並不總是工作

我最初創建的對象:

$scope.selectedItems = []; 

使用某些功能時,我可以選擇連接取消選擇:

$scope.selectAllItems = function(items){ 
     for(var i =0; i < items.length; i++){ 
      items[i].selected = true; 
      $scope.selectedItems.push(items[i]._id); 
     } 
    } 

$scope.deselectAllItems = function(items){ 
    for(var i=0; i<items.length; i++){ 
     items[i].selected = false; 
     $scope.selectedItems = []; 
    } 
} 

$scope.inverseAllItems = function(items){ 
    $scope.selectedItems = []; 
    for(var i=0; i<items.length; i++){ 
     items[i].selected = items[i].selected ? false : true; 
     if(items[i].selected) 
      $scope.selectedItems.push(items[i]._id); 
    } 
} 

$scope.selectItem = function(item){ 
    console.log(item.selected); 
    if(item.selected){ 
     console.log(item._id); 
     $scope.selectedItems.push(item._id); 
    }else{ 
     console.log("hier2"); 
     if($scope.selectedItems.indexOf(item._id)) 
      $scope.selectedItems.splice($scope.selectedItems.indexOf(item._id),1) 
    } 
} 

而且在$scope.selectedItems

$scope.$watch("selectedItems", function handleSelectedItemsChange(newValue, oldValue){ 
    console.log("$scope.selectedItems.length", $scope.selectedItems.length); 
    if($scope.selectedItems.length > 1){ 
     $scope.multipleSelect = true; 

     $('.itemStatus').toggleClass('hidden', true); 

    }else{ 
     $scope.multipleSelect = false; 
     $('.itemStatus').toggleClass('hidden', false); 
    } 
}) 

手錶的問題是,手錶並不總是被觸發。在使用'inverseSelection'和'deselectAll'功能後,它始終被觸發,但在使用'selectAll'和'selectItem'(一個選擇項目)後不會被觸發,但我沒有看到任何差異我推入selectedItems陣列中的條目。

有人可以幫我嗎?

+2

作爲一個數組,你應該使用'$ watchCollection' –

+0

aaah。簡單但這確實是解決方案。謝謝! – NVO

+0

@PankajParkar你可以做出答案。 – Alok

回答

5

更詳細地說明了一下爲什麼它是在你提到的兩個功能發生的原因是:在inverseSelectiondeselectAll函數初始化一個新的數組。

$scope.selectedItems = []; 

缺省情況下,只有$scope.$watch比較對象引用,即,「是它仍然是相同的對象」。它不關心實際的內容。這就是爲什麼當您初始化一個新的空陣列時手錶會觸發。在其他函數中,你修改一個已經存在的數組,所以引用是相同的。對於手錶來說,它是同一個物體,所以它不會發射。

正如其他人已經提到有兩種方法來解決它。 。

  1. $ $範圍與objectEquality看===真正

$scope.$watch第三個參數告訴角度爲對象的內容進行比較:

$scope.$watch("selectedItems", function handleSelectedItemsChange(newValue, oldValue){ 
    ... 
}, true) 

當objectEquality == true,watchExpression的不等式根據angular.equals函數確定

https://docs.angularjs.org/api/ng/type/%24rootScope.Scope#%24watch

  • $範圍。$ watchCollection
  • 在你的情況,這將是因爲只有它 「淺手錶」 更好的解決方案的目的。這意味着它對數組很好,但不適用於嵌套對象。對於您的陣列,性能要優於使用$scope.$watchobjectEquality

    $scope.$watchCollection("selectedItems", function handleSelectedItemsChange(newValue, oldValue){ 
        ... 
    }) 
    

    爲陣列,這意味着看着數組項;爲對象映射,這意味着看屬性

    https://docs.angularjs.org/api/ng/type/%24rootScope.Scope#%24watchCollection

    2

    您可以使用「$ watchCollection」或$ watch並且最終參數爲true。

    angular.$watch('collection', function() {}, true);

    3

    你保持在陣列(淺守望者)一個簡單的手錶,所以它只會得到火災時的陣列reference得到改變。所以要讓你的觀察者在陣列上按下操作。您可以使用$watchCollection,它將在push &上的數組元素的removal上觸發。

    $scope.$watchCollection("selectedItems", ......)