【发布时间】:2016-01-16 18:56:51
【问题描述】:
每当过滤的集合发生更改时,我都会尝试触发事件。过滤后的列表附加到 ng-repeat 中的非过滤列表。
<tr ng-repeat="item in $scope.filtered = (vm.list | filter:vm.searchText) | limitTo:vm.limit:vm.begin">
这是我想要触发的事件:
$scope.$watchCollection('filtered', function () {
alert($scope.filtered.length);
}, true);
它在页面第一次加载时触发一次,在我的 ajax 调用填充 vm.list 之前,所以警报显示为 0,但是在填充 vm.list 之后它应该再次触发,并且每次对 vm.searchText 的更改都会导致对 $scope.filtered 的更改,但不是。
我也尝试过像这样制作 $watchCollection 方法:
$scope.$watchCollection('filtered', function (newList, oldList) {
alert(newList.length);
});
但结果相同。
我也尝试按照here 的建议做,结果是这样的:
<tr ng-repeat="item in catchData((vm.list | filter:vm.searchText)) | limitTo:vm.limit:vm.begin">
$scope.catchData = function (filteredData) {
alert(filteredData.length);
return filteredData;
}
这似乎一开始就解决了。它现在在 API 调用填充列表时触发,并在 searchText 导致过滤列表更改时再次触发。不幸的是,它使得更改 limitTo 过滤器上的开始选项不再起作用。更改限制选项仍然有效,但不是开始。更改开始仍然可以使用 $watchCollection 方法。
有人有什么想法吗?
【问题讨论】:
-
也开始监视,您需要 digest() 并且由于您正在使用警报,因此您必须手动调用 apply() 方法,这将导致 digest() 运行并因此运行您的 watcher。跨度>
-
@AayushiJain 请为此引用文档。从未在手表中使用过
$apply()或$digest()来检测角度范围内的任何东西 -
item in $scope.filtered无效...视图中没有$scope...应该是item in vm.filtered =(....)并且手表在使用controllerAs时需要使用函数 -
用一点数据创建一个简单的 plunker 演示
-
你能提供你的控制器代码吗?
标签: javascript angularjs