Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Angular.JS中查看过滤后的集合?_Javascript_Angularjs - Fatal编程技术网

Javascript 如何在Angular.JS中查看过滤后的集合?

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的更改都会导致对

我正在尝试在过滤集合发生更改时触发事件。过滤列表将附加到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的更改都会导致对$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字段。在中查看更多信息