我正在尝试执行以下操作:
<div class="row" ng-repeat="user in ctr.users | filter:{entity.name:filterEntityName}" >
...但是,有些用户拥有空实体。如何仅在实体存在时过滤实体名称?
答案 0 :(得分:2)
这是具有任意长度属性链(entity.name.data
)的自定义过滤器。如果某个属性值为falsy(!val
),则item将转到输出,否则仅当目标值包含搜索目标(val.indexOf(value) != -1
)时才会发生:
angular.module('app', []).controller('ctrl', function($scope){
this.users = [
{entity:{name:{data:'Max'}}, name: 'Max'},
{entity:{name:{data:'Sam'}}, name: 'Sam'},
{name: 'Henry'},
{entity: null, name: 'John'},
{entity: {name:null}, name: 'Kate'},
{entity: {name:{data:null}}, name: 'Tom'},
]
}).filter('myfilter', function(){
return function(array, search){
var property = Object.keys(search)[0];
var value = search[property];
if(value){
var props = property.split('.');
return array.filter(x => {
for(var prop of props){
var index = props.indexOf(prop);
var last = props.length - 1;
val = index == 0 ? x[prop] : val[prop];
if(!val)
return true;
if(val && index == last)
return val.indexOf(value) != -1;
}
});
}
return array;
}
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='app' ng-controller='ctrl as ctr'>
<input type='text' ng-model='filterEntityName'/>
<div class="row" ng-repeat="user in ctr.users | myfilter:{entity.name.data:filterEntityName}">
{{user | json}}
</div>
</div>
答案 1 :(得分:0)
你可以使用&#39; !!&#39;在过滤器中,如果属性未定义或为null,则跳过。
<div class="row" ng-repeat="user in ctr.users | filter:{entity.name: '!!'}" >