Javascript 如何在Angular.JS中查看过滤后的集合?
我正在尝试在过滤集合发生更改时触发事件。过滤列表将附加到ng repeat中的非过滤列表Javascript 如何在Angular.JS中查看过滤后的集合?,javascript,angularjs,Javascript,Angularjs,我正在尝试在过滤集合发生更改时触发事件。过滤列表将附加到ng repeat中的非过滤列表 <tr ng-repeat="item in $scope.filtered = (vm.list | filter:vm.searchText) | limitTo:vm.limit:vm.begin"> 在我的ajax调用填充vm.list之前,当页面第一次加载时,它会触发一次,因此警报显示为0,但在填充vm.list之后,它会再次触发,并且每次对vm.searchText的更改都会导致对
<tr ng-repeat="item in $scope.filtered = (vm.list | filter:vm.searchText) | limitTo:vm.limit:vm.begin">
在我的ajax调用填充vm.list之前,当页面第一次加载时,它会触发一次,因此警报显示为0,但在填充vm.list之后,它会再次触发,并且每次对vm.searchText的更改都会导致对$scope.filtered的更改,但事实并非如此
我还尝试过将$watchCollection方法设置为如下:
$scope.$watchCollection('filtered', function (newList, oldList) {
alert(newList.length);
});
<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;
}
但结果是一样的
我也试着按照建议去做,结果是:
$scope.$watchCollection('filtered', function (newList, oldList) {
alert(newList.length);
});
<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;
}
$scope.catchData=函数(filteredData){
警报(filteredData.length);
返回过滤器数据;
}
一开始它好像把它修好了。它现在在API调用填充列表时激发,并且在searchText导致筛选列表更改时再次激发。不幸的是,它使得更改Limito过滤器上的begin选项不再有效。更改“限制”选项仍然有效,但“开始”选项无效。更改begin仍然适用于$watchCollection方法
有人有什么想法吗?您需要使用一个函数返回过滤列表并将对象相等设置为true
$scope.$watch(function () {
return $scope.filtered;
}, function (newList) {
alert(newList.length);
}, true);
在视图中创建一些变量时,它将作为属性添加到当前范围。因此,在本例中,您创建了
$scope.filtered
,并将其添加到当前作用域中。要在watch中使用它,您只需要使用相同的声明
$scope.$watchCollection('$scope.filtered', function () {
console.log($scope.$scope.filtered.length)
}
但最好不要使用像$scope这样的变量名,以免将它们与角度变量混淆
因此,您可以将其更改为简单的:过滤
angular.module('app',[])
.controller('ctrl',函数($scope){
$scope.$watchCollection(“$scope.filtered”,函数(nval){
if(!nval)return;//nval-监视变量的新值
log('as$scope.filtered in view',$scope.$scope.filtered.length);
},对);
$scope.$watchCollection('filtered',函数(nval){
if(!nval)return;//nval-监视变量的新值
log('as filtered in view',$scope.filtered.length);
},对);
})
作为$scope.filter
来自{{$scope.filtered}的项{{{{item}}
过滤
项{{{item}}来自{{filtered}
也要启动手表,您需要digest(),因为您使用的是alert,您必须手动调用apply()方法,这将导致digest()运行,从而导致您的手表。@AayushiJain请引用相关文档。从未在手表中使用过$apply()
或$digest()
来查找$scope中角度范围项中的任何内容。筛选的无效…视图中没有$scope
…将是vm中的项。筛选的=(…)
和watch在使用controllerAs时需要使用函数
创建一个带有少量数据的简单plunker演示。您可以提供控制器代码吗?我对使用$scope很陌生,我阅读的文档听起来好像只有在控制器中声明为$scope属性的变量才可以被查看。显然那完全不是真的。所以我注释掉了$scope.filtered=[];并将我的ng repeat更改为:。然后它完美地工作了。非常感谢。@SurpBinder,您可以查看任何$scope
字段,无论它在何时何地声明,您还可以将函数作为watchExpression
参数传递,这样您不仅可以查看$scope字段。在中查看更多信息