【问题标题】:AngularJS - Filtering Data using checkbox and textboxAngularJS - 使用复选框和文本框过滤数据
【发布时间】:2014-06-27 08:35:45
【问题描述】:

我是 angularJS 的新手,我只想使用复选框和文本框过滤我的数据,但我不知道该怎么做。请帮帮我。

这是我的数据:

  $scope.array = [
    {name: 'Tobias', lname: 'TLname', company: 'x'},
    {name: 'Jeff', lname: 'JLname', company: 'x'},
    {name: 'Brian', lname: 'BLname', company: 'x'},
    {name: 'Igor', lname: 'ILname', company: 'y'},
    {name: 'James', lname: 'JLname', company: 'z'},
    {name: 'Brad', lname: 'BLname', company: 'y'}
  ];

我想要的是,如果我要从复选框中选择 x,它将显示与 Tobias Jeff Brian 如果我要取消选中复选框并键入 brBrianBrad 将显示,但如果我要选中只有 Bryan 应该显示的 x 复选框。如果我要删除/删除 br 并检查 xy 所有相关数据应显示。 (Tobias、Jeff、Brian、Igor 和 Brad)。

尊敬的您。

【问题讨论】:

  • 如果您选中多个复选框,它的行为应该类似于OR 条件或AND?
  • 对我来说看起来像 or,虽然内置过滤器不能通过具有多个值的相同键进行过滤 - 我的意思是像 company: 'x', company: 'y' 这样的东西,您需要为此编写一个自定义过滤器跨度>
  • 你能分享一下这个吗?
  • 这里是小提琴:jsfiddle.net/w4XqV/18
  • 非常感谢您的回复 maurycy 和 dfsq

标签: javascript jquery angularjs checkbox


【解决方案1】:

您好,这可以使用自定义过滤器来完成。

这是小提琴:http://jsfiddle.net/w4XqV/27/

标记:

<div ng-app="app" ng-controller="mainCtrl">
    <div>Search by Name: <input type="text" ng-model="filters.search"></div>
       <div>Show Company X: <input type="checkbox" ng-model="companyFilters.x"/></div>
       <div>Show Company Y: <input type="checkbox" ng-model="companyFilters.y"/></div>
       <div>Show Company Z: <input type="checkbox" ng-model="companyFilters.z"/></div>
       <div ng-repeat="arr in array | filter:filters.search | customFilter:companyFilters">
           <span ng-bind="arr.name"></span>
       </div>
</div>

JavaScript:

var app = angular.module('app', []);
app.controller('mainCtrl', function($scope) {
    $scope.companyFilters = {
        x: false,
        y: false,
        z: false
    };

    $scope.filters = {
        search: ''
    };

    $scope.array = [
    {name: 'Tobias', lname: 'TLname', company: 'x'},
    {name: 'Jeff', lname: 'JLname', company: 'x'},
    {name: 'Brian', lname: 'BLname', company: 'x'},
    {name: 'Igor', lname: 'ILname', company: 'y'},
    {name: 'James', lname: 'JLname', company: 'z'},
    {name: 'Brad', lname: 'BLname', company: 'y'}
  ];
})
.filter('customFilter', function() {
  return function(input, companies) {

      console.log(input);
      consoloe.log(companies);
      var filteredList = [];

      for(var i = 0; i < input.length; i ++) {
          for(var c = 0; c < companies.length; c ++) {
              console.log(input[i].company);
              console.log(companies[i]);
              if(input[i].company === companies[c]) {
                  filteredList.push(input[i]);
                  break;
              }
          }
      }
      console.log(filteredList);
      return filteredList;
  };
});

希望这会有所帮助。

【讨论】:

  • 当然,只要添加一个 if 条件,如果一切都为假,则返回输入。见小提琴:jsfiddle.net/w4XqV/32
  • 嗨,link13,我想知道是否可以计算所有基于公司显示的数据。例如,当检查 x 和 y 时,x 的标签等于 3,y 等于 2,但是当我在文本框中键入 br 时,x 的标签将为 1,y 也将1. 请耐心等待我,我对这个平台很陌生,我开始喜欢它,因为它是开发中非常好的工具。尊敬的您。
  • 当然只是在控制器上添加一个过滤器并计数。看到这个小提琴:jsfiddle.net/w4XqV/34
  • 我喜欢它!非常感谢您的帮助。我可以知道过滤器上的 inputcompanies 是什么吗?我很困惑这些内部是什么以及程序如何填充这些。这个过滤器太棒了。我想更深入地了解它。
  • 那些通过标记填充:'customFilter:companyFilters',输入是 ng-repeat 迭代的数据集,公司是通过标记传递的'companyFilters'
【解决方案2】:

您可以编写自定义过滤功能。看看吧。

$scope.filterUsers = function (user) {

    var result = true,
        filters = $scope.filterBy,
        condition = $scope.filter;

    for (key in filters) {
        if (filters[key]) {
            if (user[key].indexOf(condition) !== -1) {
                return true;
            }
            else result = false;
        }
    }

    return result;
};

用法:

<li ng-repeat="user in array | filter:filterUsers">{{user.name}} {{user.lname}},   {{user.company}}</li>

演示:http://plnkr.co/edit/oqe5ADcE1t3OOoePE1oK?p=preview

【讨论】:

  • 您好 dfsq,感谢您的回答,但是我想要的是从复选框中过滤记录:即。如果我检查 xy 所有公司都有 xy 将显示,如果我键入文本框它将根据文本框的值过滤来自 xy 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2014-03-08
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多