【问题标题】:AngularJS: filter ng-repeat by array with multiple objectsAngularJS:通过具有多个对象的数组过滤 ng-repeat
【发布时间】:2016-01-13 23:07:54
【问题描述】:

我有一个由参数 cityfirst_name 过滤的 ng-repeat,如示例中所示:

vm.search = {
    "city": "D.C.",
    "first_name": "Chu"
};

<li ng-repeat="item in user | filter: search">...

var appname = 'app';
var dependencies = [];
angular.module(appname, dependencies);

var app = angular.module(appname);

var userC = function ($scope) {
	var vm = $scope;

    vm.search = {
        "city": "D.C.",
        "first_name": "Chu"
    };
  
    vm.user = [
        {
            "id": 1,
            "first_name": "Chuck",
            "last_name": "Norris",          
            "city": "Washington D.C.",
            "languages": [
                {
                    "id": "41",
                    "name": "English"
                },
                {
                    "id": "73",
                    "name": "Japanese"
                }
            ]
        }
    ];
};

app.controller('userC', userC);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<ul ng-app="app" ng-controller="userC">
    <li ng-repeat="item in user | filter: search track by item.id">
        {{ item.first_name }} {{ item.last_name }}
    </li>
</ul>

但现在我需要按 languages 进行过滤,这是一个对象数组:

vm.search = {
    "languages": [
      {
        "name": "Japanese"
      }
    ]
};

<li ng-repeat="item in user | filter: search">...

var appname = 'app';
var dependencies = [];
angular.module(appname, dependencies);

var app = angular.module(appname);

var userC = function ($scope) {
	var vm = $scope;

    vm.search = {
        "languages": [
          {
            "name": "Japanese"
          }
        ]
    };
  
    vm.user = [
        {
            "id": 1,
            "first_name": "Chuck",
            "last_name": "Norris",          
            "city": "Washington D.C.",
            "languages": [
                {
                    "id": "41",
                    "name": "English"
                },
                {
                    "id": "73",
                    "name": "Japanese"
                }
            ]
        }
    ];
};

app.controller('userC', userC);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<ul ng-app="app" ng-controller="userC">
    <li ng-repeat="item in user | filter: search track by item.id">
        {{ item.first_name }} {{ item.last_name }}
    </li>
</ul>

如您所见,没有结果,因为默认的 过滤器 不起作用。

有人可以帮我实现适合最后一种情况的过滤器吗?

这两个例子都在这里:

  1. http://codepen.io/anon/pen/KVvQrq
  2. http://codepen.io/anon/pen/JGypqx

【问题讨论】:

标签: arrays angularjs list filter ng-repeat


【解决方案1】:

您必须将languages 声明为对象:

vm.search = {
    "languages":
      {
        "name": "Japanese"
      }
};

Here's 密码笔。

评论后更新:如果您想要更复杂的过滤器,您可以使用函数而不是对象。 Angular 会在你的 user 数组上调用 Array.prototype.filter(),所以你的函数可以这样定义:

var allowedLanguages = [
  "Japanese",
  "Brazilian Portuguese"
];

vm.search = function(item) {
  for (var i = 0; i < item.languages.length; i++) {
    if (allowedLanguages.indexOf(item.languages[i].name) !== -1) {
      return true;
    }
  }

  return false;
};

【讨论】:

  • T H A N K. Y O U. 如此简单干净。我猜默认的 angularjs 过滤器只适用于对象?
  • 编辑:抱歉,但是使用这种方法我无法按多种语言进行过滤。例如:我需要过滤具有 “日语”“巴西葡萄牙语” 作为语言的用户。
  • 我会尽快看看,谢谢你的时间!
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 2020-05-28
  • 2018-01-28
  • 2018-05-13
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多