用于未定义属性的 ng-repeat 过滤器
Posted
技术标签:
【中文标题】用于未定义属性的 ng-repeat 过滤器【英文标题】:ng-repeat filter for where an attribute is undefined 【发布时间】:2014-09-30 08:52:08 【问题描述】:我希望这在角度上真的很简单。
我有一个包含翻译人员和其他用户的列表
[user: 'a',languages:['french','english','spanish'],
user: 'b']
然后我有一个 ng-repeat,我只想显示有语言的用户
ng-repeat="translator in users | filter: languages"
但不幸的是,我似乎无法弄清楚如何通过属性的存在进行过滤。 我已经尝试了各种方式
languages:'!undefined'
languages.length > 0
languages.length:'!0'
我不想为此编写一个外部过滤器,因为我确信它是有可能的,我只是无法正确使用术语。
【问题讨论】:
我认为您应该为用户数组中的所有元素保持相同的结构,即使用户“b”的语言为空。 你反对在作用域上写函数吗? 不同的解决方案:***.com/a/24992197/257470 【参考方案1】:<div ng-repeat="translator in users | filter : languages : '!!' ">
解释:
考虑如下列表:
$scope.items = [
propertyOne: 'a',
propertyTwo: 'hello'
,
propertyOne: 'b',
propertyTwo: null
,
propertyOne: 'c',
propertyTwo: undefined
,
propertyOne: 'd'
];
'!!'
过滤掉具有特定属性的对象或具有非未定义或空的特定属性的对象:
<div ng-repeat="item in items | filter : propertyTwo : '!!' ">
item.propertyOne
</div>
<!-- outputs: a -->
'!'
过滤掉不具有特定属性的对象或具有未定义或空的特定属性的对象:
<div ng-repeat="item in items | filter : propertyTwo : '!' ">
item.propertyOne
</div>
<!-- outputs: b c d -->
Plnkr
注意:它不适用于值为 0、false 或空字符串 ('') 的属性。
编辑:先前的答案与 plunkr 示例不同。我通过交换'!!'来修复它们和“!”。
【讨论】:
你能解释一下吗? @ebramtharwat 解释已添加。 @ebramtharwat,为了进一步解释,很多人都不知道,!!是绝对真理,对于任何非 null 或 undefined 的值都返回 true,因此像 0 和空字符串这样的原因值返回 true。不知道为什么 false 会返回?很好用,还没考虑过。 当属性类型为布尔值时,!!
似乎不适用于 angular 1.3.15
你把你的 !和 !!运算符中的例子或解释? (结果与您关于效果的陈述不符)【参考方案2】:
控制器:
var app = angular.module('app',[]);
app.controller('ctrl', function($scope)
$scope.hasLanguage = function(user)
return user.hasOwnProperty('languages');
);
html:
ng-repeat="translator in users | filter: hasLanguage"
【讨论】:
以上是关于用于未定义属性的 ng-repeat 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
Angular.js ng-repeat 按具有多个值之一(或值)的属性过滤
角.js。如何计算满足自定义过滤器的 ng-repeat 迭代