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

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

我在Angular应用程序中使用
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
      })
    }