Angularjs ng重复筛选器空值未显示

Angularjs ng重复筛选器空值未显示,angularjs,filter,null,ng-repeat,Angularjs,Filter,Null,Ng Repeat,为什么应用时角度值不显示为空值: ng-repeat="p in foo | filter: filter2" 过滤器2在哪里 $scope.filter2 = function(p){ if (p.state === null){ return p.state; } else{ return; } }; 下面是一个plnkr,我要说的是: 当它不是空的时候,过滤器工作,但是我尝试只显示空的。我可以尝试将所有空值更改为默认值字符串,而

为什么应用时角度值不显示为空值:

ng-repeat="p in foo | filter: filter2"
过滤器2在哪里

 $scope.filter2 = function(p){
    if (p.state === null){
        return p.state;
    } else{
        return;
    }
};
下面是一个plnkr,我要说的是:


当它不是空的时候,过滤器工作,但是我尝试只显示空的。我可以尝试将所有空值更改为默认值字符串,而不是空值?是否有任何地方可以让过滤器使用空值?

我认为唯一的错误是需要返回整个对象

根据Brad在下面的评论,我去查看了文档,他是对的。我的代码示例工作的唯一原因是它返回了一个“truthy”值

为了考虑到这一点,我修改了下面的代码示例

以下是过滤器:

$scope.filter2 = function(p){
    if (p.state === null){
        return true;
    } else{
        return;
    }
};
以下是文档中的相关部分:

函数(实际值、预期值):将为函数提供要比较的对象值和谓词值,如果该项应包含在筛选结果中,则该函数应返回true


|筛选器:{expression}
需要的是
true
false
求值,而不是对象。因此:

$scope.filter1 = function(p){
    return (p.state === 'on');
};

 $scope.filter2 = function(p){
    return (p.state === null);
};

您可以筛选空项,而无需编写自定义筛选器

使用plunk中的代码,将返回空项:

<ul ng-repeat="p in foo | filter:{state:'!'}" >
  <li>{{p.name}}</li>
</ul>
<ul ng-repeat="p in foo | filter:{state:'!!'}" >
  <li>{{p.name}}</li>
</ul>
  • {{p.name}}
相反,这将返回所有非空项:

<ul ng-repeat="p in foo | filter:{state:'!'}" >
  <li>{{p.name}}</li>
</ul>
<ul ng-repeat="p in foo | filter:{state:'!!'}" >
  <li>{{p.name}}</li>
</ul>
  • {{p.name}}

双not运算符将任何值转换为布尔值:第一个not运算符
将真值转换为布尔值
false
,第二个值将布尔值反转回
true
。在我的测试中,过滤器实际上只通过使用
状态来工作:'
,但我会使用
为了安全起见…

您可以在表达式中测试Null,如下所示:

ng-repeat="p in foo | filter:{state:null}"

你也可以这样做

<ul ng-repeat="p in foo" >
  <li ng-if = "p.states">{{p.name}}</li>
</ul>
  • {{p.name}

哈哈,我知道你做了什么。您返回了p而不是p.state。如果行得通的话。。。在javascript中不能返回空值吗?我想你可以。你可以,但也许ng repeat不喜欢不同的解决方案: