1

我試圖在控制器中觀察視圖中的過濾器生成的集合時出現問題。

我過濾後的數據存儲在一個變量:

<table class="table"> 
    <tr ng-repeat="item in filteredCollection = (myCollection | filter: txtSearch)"> 
     <td ng-bind="item"></td> 
    </tr> 
</table> 

,我想訂閱我的控制器「filteredCollection」的變化:我已經設置了this JSFiddle顯示

$scope.$watchCollection('filteredCollection', function() { 
    if (typeof($scope.filteredCollection) != 'undefined') 
     console.log('Results changed : ' + $scope.filteredCollection.length); 
}); 

你是我的問題:我的手錶功能從未被調用過。

有趣的事實,它可以在我的HTML中刪除所有<tabset> <tab>標籤。我想我搞砸了$範圍,但我不明白爲什麼。也許這個tabset會創建一個新的$ scope子元素或者其他東西。

我希望你們會發現這是怎麼回事,

乾杯

回答

1

儘量把filteredCollection中的對象,所以它會改變正確的範圍屬性:

$scope.obj = { filteredCollection : [] }; 
$scope.$watchCollection('obj.filteredCollection', function(newVal) { 
    if (typeof($scope.obj.filteredCollection) != 'undefined') 
     console.log('Results changed : ' + $scope.obj.filteredCollection.length); 
}); 

在HTML中:

<tr ng-repeat="item in obj.filteredCollection = (myCollection | filter: txtSearch)"> 

看到這個fiddle

+0

謝謝您的回答,但你能解釋爲什麼我必須這樣做嗎?它是通過引用/值傳遞的變量的問題嗎? – bviale 2015-04-01 14:31:36

+0

這是因爲ngRepeat創建一個子範圍,然後你的filteredCollection將是該範圍的一個屬性。如果你在父範圍上定義了一個obj,那麼每一個變化都將被寫入到該父範圍中。看到這個:https://github.com/angular/angular.js/wiki/Understanding-Scopes – eladcon 2015-04-01 14:36:37

1

你的想法正確無誤,tabsettab創建新的範圍。因爲你正在失去filteredCollection的上下文,因爲這是在tab指令範圍內創建的。

Angular最近增加了controllerAs語法,有助於避免這種情況。它允許我們更好地確定哪些範圍正在執行。

我已經用controllerAs語法更新了您的jsFiddle,以顯示它如何提供幫助。現在手錶如預期般閃光。

http://jsfiddle.net/hezwyjx1/2/

下面是一些幫助控制器作爲語法的資源:

http://toddmotto.com/digging-into-angulars-controller-as-syntax/

+0

謝謝你這個有趣的方法,我不知道這個「controllerAs」的事情,文章是偉大的。但就我而言,我覺得這個解決方案比將這個集合放在一個對象中更重要 – bviale 2015-04-01 14:47:41