我有一个包含对象数组的对象,如下所示:
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'}">
这样的事情可能吗?
答案 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')">