如何在以下示例中应用NOT过滤器?
尝试$filter('filter')(users,{ranks: {id: '!' + '15'},true)
和$filter('filter')(users, !{ranks: {id:15}},true)
,但似乎没有任何效果。
这里的目的是在过滤后的数组
中不让id = 15的用户控制器:
app.controller('MainCtrl', function($scope,$filter) {
$scope.users = [
{
id: 1,
name: 'John Doe',
ranks: [
{ id: 1, name: 'Admin'},
{ id: 2, name: 'Doe' }
],
},
{
id: 2,
name: 'Barbara Doe',
ranks: [ { id: 15, name: 'Wife'}, { id: 2, name: 'Doe' }],
},
{
id: 3,
name: 'Jane Doe',
ranks: [ { id: 16, name: 'Wife'}, { id: 17, name: 'Doe' }],
},
];
$scope.filter = $filter('filter')($scope.users, {ranks: {id: !15}},true);
});
HTML:
<p>HTML Filter: List of users without having a rank with id: 15</p>
<ul>
<li ng-repeat="user in users | filter:{ranks: {id: '!' + '15'}} : true">
{{ user }}
</li>
</ul>
<p>Controller Filter: List of users without having a rank with id: 15</p>
<ul>
<li ng-repeat="user in filter ">
{{ user }}
</li>
</ul>
Plunker: http://plnkr.co/edit/73lLDpn3uLHozObKn539?p=preview
答案 0 :(得分:2)
您正在尝试过滤其排名属性包含{id:15}的用户,您可能无法选择编写自定义过滤器或谓词函数来执行此操作(因为这不是传统的==或!=比较)
以下是使用谓词函数的示例:
ranksContainsId15 = function(user, index, users){
// Look for rank.id === 15
for(var i=0; i < user.ranks.length; i++){
if(user.ranks[i].id === 15){
return false; // so this user will NOT be included
}
}
// no rank.id === 15 found, so this user will be included
return true;
}
$scope.filtered = $filter('filter')($scope.users, ranksContainsId15);
我已更新示例以显示所有用户,然后显示其排名数组中没有rank.id == 15的用户
http://plnkr.co/edit/6x3OEzSiDfIziAnVQ0Em?p=preview
要使用可编程ID创建谓词函数,请使用函数创建它们
createPredicateFn = function(id){
return function(user, index, users){
for(var i=0; i < user.ranks.length; i++){
if(user.ranks[i].id === id){
return false;
}
}
return true;
}
}
$scope.filtered = $filter('filter')($scope.users, createPredicateFn(15));
答案 1 :(得分:1)
您可以创建自定义过滤器来手动过滤项目:
HAVING COUNT(*)>=TIMESTAMPDIFF(WEEK,'2015-03-01',NOW())
并像这样使用:
.filter('customFilter', function() {
return function(array, numberToSkip) {
var result = [];
for (i = 0; i < array.length; i++) {
var arrayItemContainsId = false;
for (j = 0; j < array[i].ranks.length; j++) {
if (array[i].ranks[j].id === numberToSkip) {
arrayItemContainsId = true;
}
}
if (arrayItemContainsId == false) {
result.push(array[i]);
}
}
return result;
};
});
答案 2 :(得分:-1)
您已经实现了非过滤器略有错误。请改用
<li ng-repeat="user in users | filter: !{ranks: {id:15}} : true">