angularjs - 按多个模型过滤

时间:2013-10-11 20:38:03

标签: angularjs

这似乎一定很简单,我找不到答案。

假设我有一个数据数组,如下所示:

friends = [{name:'John', age:60, location:'Brighton', street:'Middle Street'},
{name:'Bob', age:5, location:'Brighton', street:'High Street'}];

现在,我想根据文本输入过滤数据:

<input ng-model="searchText">
<ul>
    <li ng-repeat="friend in friends | orderBy:'name' | filter:searchText">
    {{friend.name}} - {{friend.location}}</li>
</ul>

这很好但是它根据朋友对象的每个属性(名称,年龄,位置和街道)过滤输入文本。我希望能够仅根据名称和位置进行过滤(忽略年龄和街道)。如果没有自定义过滤器,这可能吗?

4 个答案:

答案 0 :(得分:7)

是的,只需将谓词传递给过滤器而不是字符串即可:

<li ng-repeat="friend in friends | orderBy:'name' | filter:friendContainsSearchText">

$scope.friendContainsSearchText = function(friend) {
    return friend.name.indexOf($scope.searchText) >= 0 || friend.location.indexOf($scope.searchText) >= 0
}

答案 1 :(得分:2)

以下是我们使用自定义过滤器的方式。

DEMO http://plnkr.co/edit/q7tYjOvFjQHSR0QyGETj?p=preview

[array] | search:query:columns:operator

> query: this is the term you are looking for
> columns: an array of the names of the properties you want to look for (if empty, will use the angular filter with query)
> operator: a boolean to switch between OR (true) and AND (false, default)

<强> HTML

<ul>
  <li ng-repeat="item in list | search:query:['name','location']:operator">
    <pre>{{item | json}}</pre>
  </li>
</ul>

<强> JS

app.filter('search', function($filter) {
  return function(input, term, fields, operator) {
    if (!term) {
       return input;
    }

    fields || (fields = []);

    if (!fields.length) {
      return $filter('filter')(input, term);
    }

    operator || (operator = false); // true=OR, false=AND

    var filtered = [], valid;

    angular.forEach(input, function(value, key) {
      valid = !operator;
      for(var i in fields) {
        var index = value[fields[i]].toLowerCase().indexOf(term.toLowerCase());
        // OR : found any? valid
        if (operator && index >= 0) { 
          valid = true; break;
        } 
        // AND: not found once? invalid 
        else if (!operator && index < 0) { 
          valid = false; break;
        }
      }
      if (valid) {
        this.push(value);
      }
    }, filtered);

    return filtered;
  };
});

答案 2 :(得分:1)

或者您也可以使用:

<li ng-repeat="friend in friends | orderBy:'name' | filter:{ name :searchText}">

答案 3 :(得分:-1)

你可以像......一样放几个过滤器。

<div>
    <input ng-model="Ctrl.firstName" />
    <input ng-model="Ctrl.age" />

    <li ng-repeat = "employee in Ctrl.employees | filter:{name:Ctrl.firstName} | filter:{age:Ctrl.age}">{{employee.firstName}}</li>
</div>