如何检查对象的子数组是否包含角度过滤器中的字符串

时间:2016-04-30 18:57:01

标签: angularjs

我有一个包含对象数组的对象,如下所示:

Companies =
{
  "-KGZPUea1ZtWVXspLRGF" : {
    "assignedUsers" : [ {
      "email" : "talon@gmail.com"
    } ],
    "name" : "Talon"
  },
  "-KGcS8doqRw1Jcemhxuz" : {
    "assignedUsers" : [ {
      "email" : "billy@gmail.com",
      "status" : "active"
    } ],
    "name" : "Billy"
  }
}

我无法创建一个角度过滤器,只过滤掉分配了特定电子邮件且状态有效的公司。

像这样的东西

<div ng-repeat="company in Companies | filter:{assignedUsers contains 'billy@gmail.com' && assignedUsers.status == 'active'}">

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

是的,这是可行的。不,它不能完全在你看来完成。

由于过滤器可以使用函数进行评估,因此可以将此逻辑写入控制器。

scope.testCompany = function(company) {
    if (!company || !company.assignedUsers) return false;

    for (var i = 0; i < company.assignedUsers.length; i++) {
        var e = company.assignedUsers[i];

        if (e.email === 'billy@gmail.com' && e.status === 'active') {
            return true;
        }
    }

    return false;
};

然后你可以使用它。

<div ng-repeat="company in Companies | filter:testCompany">

如果要动态设置电子邮件地址,则有两种选择。一种是设置一个新的过滤器(如angular.module(...).filter(...)),或者你可以从上面设置你的函数来接受一个参数。过滤器选项可能在哲学上更好一点,但要么有效。

scope.testCompanyForEmail = function(emailAddress) {
    return function(company) {
        if (!company || !company.assignedUsers) return false;

        for (var i = 0; i < company.assignedUsers.length; i++) {
            var e = company.assignedUsers[i];

            if (e.email === emailAddress && e.status === 'active') {
                return true;
            }
        }

        return false;
    }
};

利用为:

<div ng-repeat="company in Companies | filter:testCompanyForEmail('billy@gmail.com')">
相关问题