我有一个对象数组,我使用ng-repeat
在我的Angular应用中显示。我正在使用filter
和搜索输入的值过滤掉项目。它按预期工作。但是,我有一个“全选”/“取消全选”选项,我只想选择列表中的 visibile 项目(符合当前搜索条件的项目)。
如果我的控制器中没有执行相同的逻辑(即使用indexOf
我的每个对象上的搜索值),如何判断ng-repeat
/ {{1}当前过滤了哪些项目}?
我的观点:
filter
我的控制器中的一个功能:
<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>
为了简单起见,我在这里大大简化了我的代码示例,因为这个问题不需要更多细节。有没有办法做我正在思考或做的事情我需要再次执行“搜索”?
答案 0 :(得分:18)
您可以将过滤后的数组绑定到视图中的另一个范围变量,然后在控制器中访问该变量。
查看:
<tr ng-repeat="item in filteredItems = (items | filter:searchValue)">
...
</tr>
控制器:
$scope.toggleAll = function () {
angular.forEach($scope.filteredItems, function (item) {
// do stuff
})
}
答案 1 :(得分:1)
您的问题是ng-repeat是范围隔离的。因此,您无法从控制器/指令引用由ng-repeat管理的内部列表。
因此有2个选项
将过滤后的列表绑定到控制器/指令中的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 items = $filter('yourFilter')($scope.items, $scope.searchText);
for(var i in items){
//set your selected property
}
}
答案 2 :(得分:1)
角度过滤器创建a new array.因此,为了对已过滤的项目执行操作,您必须捕获新数组。
类似的东西:
$scope.toggleAll() {
var filteredItems = $filter('filter')($scope.items, $scope.searchValue);
for(var i in filteredItems) {
...
}
}
如果您不想过滤两次,那么每次searchValue
更改并且ng-repeat
过滤后的数组时,您必须自己过滤数组,ng-change是在这种情况下很有用。