Javascript 使用ng repeat和filter,如何判断哪些项目是可见的?
我在Angular应用程序中使用Javascript 使用ng repeat和filter,如何判断哪些项目是可见的?,javascript,html,angularjs,Javascript,Html,Angularjs,我在Angular应用程序中使用ng repeat显示了一组对象。我使用filter和搜索输入的值筛选出项目。它按预期工作。但是,我有一个“全部选择”/“全部取消选择”选项,我只想选择列表中的可见项(满足当前搜索条件的项) 如果不在我的控制器中执行相同的逻辑(即在我的每个对象上使用indexOf搜索值),我如何判断哪些项目当前被ng repeat/过滤器过滤掉 我的看法是: <input type="text" ng-model="searchValue"> <input ty
ng repeat
显示了一组对象。我使用filter
和搜索输入的值筛选出项目。它按预期工作。但是,我有一个“全部选择”/“全部取消选择”选项,我只想选择列表中的可见项(满足当前搜索条件的项)
如果不在我的控制器中执行相同的逻辑(即在我的每个对象上使用indexOf
搜索值),我如何判断哪些项目当前被ng repeat
/过滤器过滤掉
我的看法是:
<input type="text" ng-model="searchValue">
<input type="checkbox" ng-model="checkAll" ng-change="toggleAll()">
<tr ng-repeat="item in items | filter:searchValue">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
</tr>
为了简单起见,我在这里大大简化了我的代码示例,因为这个问题不需要太多细节。有没有办法按照我的想法去做,或者我需要再次执行“搜索”吗?您的问题是ng repeat是范围隔离的。因此,您无法从控制器/指令中引用由ng repeat管理的内部列表
因此,有两种选择
将筛选列表绑定到控制器/指令中的ng repeat,以便维护筛选列表
//in your controller
$scope.filteredItems = $filter('yourFilter')($scope.items,$scope.searchText);
$scope.$watch('searchText', function(newValue){
$scope.filteredItems = $filter('yourFilter')($scope.items, newValue);
});
//in your view
<tr ng-repeat="item in filteredItems">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
</tr>
角度过滤器的创建是为了对过滤项执行操作,您必须捕获新数组
比如:
$scope.toggleAll() {
var filteredItems = $filter('filter')($scope.items, $scope.searchValue);
for(var i in filteredItems) {
...
}
}
如果不想过滤两次,则每次searchValue
更改和ng repeat
对过滤后的数组进行过滤时,您必须自己过滤数组,这在这种情况下非常有用。您可以将过滤后的数组绑定到视图中的另一个范围变量,然后在控制器中访问该变量
视图:
不要在数组中使用“for..in”
!它做不到你想要的@你说得对。我只是简单地复制并粘贴了这篇文章的片段。这是一天的结束,我发誓!感谢您通知OP=DCheck out@azium对我答案的评论。你可能会想用,当然,我只是把它作为一个简单的例子扔出去了!谢谢。我以前从未见过这个功能,太棒了!你知道他们是什么时候添加的吗?我不知道,但我有一些1.27代码使用它。。这已经有一段时间了。这太棒了——正是我所希望的。非常感谢。很好用,不幸的是,它不被angular utils dir paginate支持,以防其他人偶然发现它并拥有相同的功能issues@pcnate你们有什么解决方案吗?
$scope.toggleAll() {
var items = $filter('yourFilter')($scope.items, $scope.searchText);
for(var i in items){
//set your selected property
}
}
$scope.toggleAll() {
var filteredItems = $filter('filter')($scope.items, $scope.searchValue);
for(var i in filteredItems) {
...
}
}
<tr ng-repeat="item in filteredItems = (items | filter:searchValue)">
...
</tr>
$scope.toggleAll = function () {
angular.forEach($scope.filteredItems, function (item) {
// do stuff
})
}