Фильтр ng-repeat на булевом
Я пытаюсь отфильтровать булевское значение в ng-repeat.
Список незарегистрированных пользователей:
<h3>Unregistered Users</h3>
<div ng-repeat="user in users | filter:!user.registered">
<div class="row-fluid">
<div class="span2">
{{user.name}}
</div>
</div>
</div>
Список зарегистрированных пользователей:
<h3>Registered Users</h3>
<div ng-repeat="user in users | filter:user.registered">
<div class="row-fluid">
<div class="span2">
{{user.name}}
</div>
</div>
</div>
Есть хороший способ фильтрации на основе зарегистрированных и зарегистрированных.
Ответы
Ответ 1
фильтр по выражению obj:
<h3>Unregistered Users</h3>
<div ng-repeat="user in users | filter:{registered:false}">
<div class="row-fluid">
<div class="span2">
{{user.name}}
</div>
</div>
</div>
JSFiddle: http://jsfiddle.net/alfrescian/9ytDN/
Ответ 2
Создайте метод в контроллере, который возвращает true или false на основе требуемой логики и укажет эту функцию в фильтре.
Что-то вроде этого:
$scope.isRegistered = function(item) {
return item.registered;
};
<h3>Unregistered Users</h3>
<div ng-repeat="user in users | filter:!isRegistered ">
<div class="row-fluid">
<div class="span2">
{{user.name}}
</div>
</div>
</div>
Ответ 3
Если элемент не имеет логического свойства, вы можете найти элемент с атрибутом, не установленным в true, с помощью '!' с кавычками. e.x. filter: {property: '!' + true}.
Пример:
$scope.users = [
{
name : 'user1 (registered)',
registered : true
},
{
name : 'user2 (unregistered)'
},
{
name : 'user3 (registered)',
registered : true
},
{
name : 'user4 (unregistered)'
}
Чтобы получить незарегистрированные пользователи, выполните следующие действия:
<h3>Unregistered Users</h3>
<div ng-repeat="user in users | filter:{registered:'!'+true}">
<div class="row-fluid">
<div class="span2">
{{user.name}}
</div>
</div>
</div>
Ответ 4
Был тот же вопрос. Решение Alfrescian не работало для меня на Angular 1.1.5.
Нашел эту скрипту: http://jsfiddle.net/buehler/HCjrQ/
.filter('onlyBooleanValueFilter', [function(){
return function(input, param){
var ret = [];
if(!angular.isDefined(param)) param = true;
angular.forEach(input, function(v){
// 'active' is a hard-coded field name
if(angular.isDefined(v.active) && v.active === param){
ret.push(v);
}
});
return ret;
};
}])
Вам нужно будет настроить код фильтра в соответствии с вашим полем.
Ответ 5
Незначительная модификация ответа Websirnik, это позволяет использовать любое имя столбца для набора данных:
.filter('onlyBooleanValueFilter', [function () {
return function (input, column, trueOrFalse) {
var ret = [];
if (!angular.isDefined(trueOrFalse)) {
trueOrFalse = false;
}
angular.forEach(input, function (v) {
if (angular.isDefined(v[column]) && v[column] === trueOrFalse) {
ret.push(v);
}
});
return ret;
};
}])
Разметка:
<div repeat="row in your.dataset | onlyBooleanValueFilter: 'yourColumn' : true">
...your stuff here....
</div>