【发布时间】:2017-01-17 21:07:48
【问题描述】:
我有一个 $scope.users 用于显示表格,我需要应用具有多个选项的过滤器,
这里是$scope.users 对象:
[
{
"login": "andres.un1@mail.com",
"merchant": {
"merchantId": 500095,
"status": "ENABLED",
"defaultAccountId": null,
"accounts": {
"500092": "ADMIN",
"500178": "CONSULT",
"500180": "ADMIN",
"500182": "ADMIN",
"500201": "ADMIN"
}
},
"name": "Carlos"
},
{
"login": "andres.un2@mail.com",
"merchant": {
"merchantId": 500095,
"status": "DISABLED",
"defaultAccountId": null,
"accounts": {
"500092": "CONSULT",
"500178": "MANAGER",
"500180": "ADMIN",
"500182": "ADMIN",
"500201": "ADMIN"
}
},
"name": "Carlos Andres"
},
{
"login": "cosme.fulanito@mail.com",
"merchant": {
"merchantId": 500095,
"status": "DISABLED",
"defaultAccountId": null,
"accounts": {
"500092": "CONSULT",
"500178": "MANAGER",
"500180": "ADMIN",
"500182": "ADMIN",
"500201": "ADMIN"
}
},
"name": "Cosme"
}
]
在过滤器中,我从$scope 传递其他对象来过滤数据,在本例中是我之前在指令中计算的$scope.searchParams。
$scope.searchParams:
[
{'name':'Cosme'},
{'login':'andres.un1@mail.com'},
{'status':'ENABLED'},
{'status':'DISABLED'},
{'account':'267123'},
{'account':'543987'},
{'account':'544111'},
{'account':'543987'}
]
如您所见,name 和 login 在过滤器中是唯一的,但 status 和 account 可以在过滤器中应用多个值。这是我的方法,但我认为非常无效,也不完整,因为没有多重过滤器功能:
var secUser = function () {
return function (input, list) {
var out = [];
var nameArr = [],
loginArr = [],
statusArr = [],
profileArr = [],
accountsArr = [];
angular.forEach(list, function(filter){
console.log(filter);
if(filter.hasOwnProperty('name')){
nameArr.push(filter.name);
}
if(filter.hasOwnProperty('login')){
loginArr.push(filter.login);
}
if(filter.hasOwnProperty('status')){
statusArr.push(filter.status);
}
if(filter.hasOwnProperty('account')){
accountsArr.push(filter.account);
}
if(filter.hasOwnProperty('profile')){
profileArr.push(filter.profile);
}
});
angular.forEach(input, function(user){
// no filters applied
if(nameArr.length < 1 && loginArr.length < 1 &&
statusArr.length < 1 && accountsArr.length < 1 &&
profileArr.length < 1){
out.push(user);
}
// filters to be applied
else{
if(nameArr.indexOf(user.name) > -1){
out.push(user);
}
if(loginArr.indexOf(user.login) > -1){
out.push(user);
}
if(statusArr.indexOf(user.merchant.status) > -1){
out.push(user);
}
}
});
return out;
};
};
//-- register filter
app.filter('secUser', secUser);
最后这里是我使用 fiter 的方法:<tbody ng-repeat="user in users | secUser:searchParams " class="table-striped">
¿考虑到将来可能会有更多过滤器字段,是否有更好的方法来实现此过滤器?另外我认为是非常耦合的观点。
【问题讨论】:
标签: javascript angularjs filter