AngularJS过滤器不为空


69

尝试滤除具有非null的特定属性的项目

var details = [{name:'Bill', shortDescription: null}, {name:'Sally', shortDescription: 'A girl'}]

我只想显示一个李;一个给萨莉。这是我没有成功尝试过的

<ul>
<li ng-repeat="detail in details | filter:{shortDescription:'!'}">
<p>{{detail.shortDescription}}</p>
</li>
</ul>

您知道如何在不创建自定义过滤器的情况下执行此操作吗?甚至如此,自定义过滤器会是什么样?


Answers:


40

根据https://github.com/angular/angular.js/issues/11573的Angular> = 1.4,建议使用'',它匹配除null / undefined以外的任何基本类型。

<ul>
    <li ng-repeat="detail in details | filter:{shortDescription: ''}">
        <p>{{detail.shortDescription}}</p>
    </li>
</ul>

1
感谢您的发布!
James Drinkard

5
工作,谢谢。但是在这种情况下,angularjs语法是荒谬的(filter--)。
MCurbelo

1
@MCurbelo,我自己的带有过滤器语法的小表情是“过滤器”一词不明确。被过滤无效的描述?还是过滤空描述?看代码无法分辨。更好的名称是“ filterOut”或“ showOnly”(具有适当的语义)。
user2023861

123

角> = 1.3.16到最新(写入/更新时为1.5.5)使用''(空字符串)(或'!!'也可以)

<ul>
    <li ng-repeat="detail in details | filter:{shortDescription: ''}">
        <p>{{detail.shortDescription}}</p>
    </li>
</ul>

示例:http//jsfiddle.net/TheSharpieOne/1mnachk6/


角度> = 1.3.6和<= 1.3.15使用 '!null'

<ul>
    <li ng-repeat="detail in details | filter:{shortDescription: '!null'}">
        <p>{{detail.shortDescription}}</p>
    </li>
</ul>

示例:http//jsfiddle.net/TheSharpieOne/4wxs67yv/


角> = 1.2和<= 1.3.5使用''(空字符串)(或'!!'也可以)

<ul>
    <li ng-repeat="detail in details | filter:{shortDescription: ''}">
        <p>{{detail.shortDescription}}</p>
    </li>
</ul>

示例:http//jsfiddle.net/TheSharpieOne/ovsqf17n/


角度<1.2 '!!'

<ul>
    <li ng-repeat="detail in details | filter:{shortDescription: '!!'}">
        <p>{{detail.shortDescription}}</p>
    </li>
</ul>

示例:http//jsfiddle.net/TheSharpieOne/RGEdc/


总体而言,它'!!'提供了最好的支持,但是''建议使用(空字符串),并为此目的而设计


3
非常感谢。在网路上搜寻了一个多小时,却找不到
Scotty Bollinger 2013年

2
没问题。它还过滤掉undefined
TheSharpieOne 2013年

@TalasanNicholson,如果它对null / undefined进行过滤,则可以为false。
BrianS 2014年

@TheSharpieOne是否记录在案?
BrianS 2014年

似乎无法使用复选框value="!!" jsfiddle.net/2RBV9
Syl

6

我认为这更容易阅读

 <ul>
    <li ng-repeat="detail in details" ng-if="detail.shortDescription">
        <p>{{detail.shortDescription}}</p>
    </li>
 </ul>

关于过滤空值有很多解决方案,这是我更喜欢的解决方案
alfredopacino

这样做的缺点是,如果您有一千条记录,它仍会打印与没有简短描述的记录一样多的注释标签。过滤器选项可以防止这种情况。
詹姆斯·格雷

1

值得注意的是,要使用空引号解决方案,您需要将比较器的默认设置为false。您可能习惯于在控制器过滤器中加入true,就像这样:

const myAssessments = 
       this.filterFilter(this.assessments, {userId: this.user.id}, true);

没有final的话,那种严格的过滤器就无法工作true。但是您需要删除true或使其为false,以使非null的检查起作用:

const activeAndHistoric = 
      this.filterFilter(filteredAssessments, {historicYear: ''}, false);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.