ng-repeat过滤器,用于未定义属性的位置

时间:2014-08-07 07:51:38

标签: angularjs filter

我希望这个角度非常简单。

我有一个包含翻译和其他用户的列表

[{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'}

我不想为此写一个外部过滤器,因为我确信它有可能是有角度的,我只是无法正确理解。

2 个答案:

答案 0 :(得分:40)

<div ng-repeat="translator in users | filter : { languages : '!!' }">

说明:

考虑如下列表:

$scope.items = [
    {
        propertyOne: 'a',
        propertyTwo: 'hello'
    },
    {
        propertyOne: 'b', 
        propertyTwo: null
    },
    {
        propertyOne: 'c', 
        propertyTwo: undefined
    },
    {
        propertyOne: 'd'
    }
];

'!!'过滤掉具有某个属性的对象或具有某个未定义属性或null的对象:

<div ng-repeat="item in items | filter : { propertyTwo : '!!' }">
    {{item.propertyOne}}
</div>
<!-- outputs: a -->

'!'过滤掉没有某些属性的对象或具有未定义或null的特定属性的对象:

<div ng-repeat="item in items | filter : { propertyTwo : '!' }">
    {{item.propertyOne}}
</div>
<!-- outputs: b c d -->

<强> Plnkr

注意:它不适用于值为0,false或空字符串('')的属性。

编辑:之前的回答与plunkr示例不同。我通过交换'!!'来修复它们和'!'。

答案 1 :(得分:3)

控制器:

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"