使用ng-repeat和filter,如何判断哪些项目可见?

时间:2015-06-08 20:17:10

标签: javascript html angularjs

我有一个对象数组,我使用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>

为了简单起见,我在这里大大简化了我的代码示例,因为这个问题不需要更多细节。有没有办法做我正在思考或做的事情我需要再次执行“搜索”?

3 个答案:

答案 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个选项

  1. 将过滤后的列表绑定到控制器/指令中的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>
    
  2. 在控制器/指令

    中再次执行过滤器
    $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是在这种情况下很有用。