对于我的AngularJS项目(v1.2.3),我有一个路由列表,我正在尝试从对象构建导航栏。我想要做的是在一种样式中显示具有未定义isRight
属性的任何对象,并在另一种样式中定义属性。
在一个ng-repeat
中,我想使用未定义的isRight
属性过滤这些对象。如何在ng-repeat
属性中完成此操作,而无需使用创建自定义过滤器功能?
$scope.nav = [
{ path: '/', title: 'Home' },
{ path: '/blog', title: 'Blog' },
{ path: '/about', title: 'About' },
{ path: '/login', title: 'Login', isRight: true }
];
我意识到我可以将属性isRight: false
添加到每个对象,或者为左右侧链接添加单独的导航对象,以及其他此类简单的解决方法,但我很好奇是否有办法实现此目的使用当前结构,使用以下内容:
<li ng-repeat="link in nav | filter:{isRight:undefined}">
这更像是一种好奇而非需要,但我感谢任何建议。
答案 0 :(得分:51)
您可以否定过滤器表达式。因此,您可以过滤掉undefined
不是isRight
)的任何内容,而不是处理!
。像这样:
<li ng-repeat="link in nav | filter:{isRight:'!true'} ">
相反,你可以做到:
<li ng-repeat="link in nav | filter:{isRight:'true'} ">
答案 1 :(得分:42)
您也可以使用
<li ng-repeat="link in nav | filter:{isRight:'!'}">
另见How to display placeholders in AngularJS for undefined expression values?
var app = angular.module('myApp', [])
app.controller('mainCtrl',['$scope' , function($scope) {
$scope.nav = [
{ path: '/', title: 'Home' },
{ path: '/blog', title: 'Blog' },
{ path: '/about', title: 'About' },
{ path: '/login', title: 'Login', isRight: true }
];
}])
&#13;
<div ng-app="myApp" ng-controller="mainCtrl">
<h3>!isRight</h3>
<ul>
<li ng-repeat="link in nav | filter:{isRight:'!'}">{{link.title}}</li>
</ul>
<h3>isRight</h3>
<ul>
<li ng-repeat="link in nav | filter:{isRight:'!!'}">{{link.title}}</li>
</ul>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
&#13;
答案 2 :(得分:8)
修改强>
我只是重读了这个问题,这不是你要找的答案。我将把它留在这里用于文档目的,但我认为没有办法获得你想要的功能,无需构建自定义过滤器或使用自定义过滤器功能。
为了扩展为什么查找undefined将无法使用默认过滤器,我们会查看AngularJS filter
实现中的this代码。
switch (typeof expression) {
...
case "object":
// jshint +W086
for (var key in expression) {
(function(path) {
if (typeof expression[path] == 'undefined') return;
predicates.push(function(value) {
return search(path == '$' ? value : getter(value, path), expression[path]);
});
})(key);
}
break;
...
}
如果过滤器对象的属性值为undefined
,则不会向谓词数组添加谓词函数。在您的情况下,您要将isRight
属性的值设置为undefined
(您的过滤器表达式为{isRight:undefined}
)。
原始答案
您始终可以使用谓词函数创建任意过滤器(documentation)。
谓词函数可用于写入任意过滤器。该 为数组的每个元素调用函数。最终的结果是 谓词返回true的那些元素的数组。
在您的控制器中创建一个方法来挑选您想要的项目
$scope.isRightUndefined = function(item) {
return item.isRight === undefined;
}
并将您的重复更改为
<li ng-repeat="link in nav | filter:isRightUndefined">
答案 3 :(得分:4)
module.filter('notNullOrUndefined', [function () {
return function (items, property) {
var arrayToReturn = [];
for (var i = 0; i < items.length; i++) {
var test = property !== undefined ? items[i][property] : items[i];
if (test !== undefined && test !== null) {
arrayToReturn.push(items[i]);
}
}
return arrayToReturn;
};
}]);
用法:
<div class="col-md-12" ng-repeat="style in styles | notNullOrUndefined:'background'">
<span class="ed-item">{{style.name}} Background</span>
</div>