Angular ng-repeat пропустить элемент, если он соответствует выражению
Я ищу способ в основном сказать angular пропустить элемент в ng-repeat, если он соответствует выражению, в основном continue
;
В контроллере:
$scope.players = [{
name_key:'FirstPerson', first_name:'First', last_name:'Person'
}, {
name_key:'SecondPerson', first_name:'Second', last_name:'Person'
}]
Теперь в моем шаблоне я хочу показать всем, что не соответствует name_key='FirstPerson'
. Я решил, что это фильтры, поэтому я настраиваю Plunkr, чтобы поиграть с ним, но не повезло. Plunkr Попытка
Ответы
Ответ 1
Как предложил @Maxim Shoustin, лучший способ добиться того, что вы хотите, - это использовать настраиваемый фильтр.
Но есть и другие способы: одна из них - использовать директиву ng-if
на том же элементе, если бы вы поместили директиву ng-repeat
(также здесь плункер):
<ul>
<li ng-repeat="player in players" ng-if="player.name_key!='FirstPerson'"></li>
</ul>
Это может представлять незначительный недостаток с точки зрения эстетики, но имеет большое преимущество в том, что ваша фильтрация может основываться на правиле, которое не так тесно связано с массивом players
и которое может легко получить доступ к другим данным в вашем приложении область действия:
<li
ng-repeat="player in players"
ng-if="app.loggedIn && player.name != user.name"
></li>
Обновление
Как было сказано, это одно из решений для этой проблемы и может или не может удовлетворить ваши потребности.
Как указано в комментариях, ng-if
- это директива, которая на самом деле означает, что она может делать больше вещей в фоновом режиме, чем вы могли бы ожидать.
Например, ng-if
создает из него новую область:
Объем, созданный в ngIf, наследуется от его родительской области с использованием прототипального наследования.
Это обычно не влияет на нормальное поведение, но, чтобы предотвратить непредвиденные случаи, вы должны помнить об этом перед реализацией.
Ответ 2
Я знаю, что это старый, но если кто-то будет искать другое возможное решение, вот еще один способ решить эту проблему - используйте стандартный filter:
Объект: объект шаблона может использоваться для фильтрации определенных свойств в объекты, содержащиеся в массиве. Например {name: "M", телефон: "1" } предикат возвращает массив элементов, имеющих имя свойства содержащий "М" и телефон с содержанием "1".... Предикат может быть отменено путем префикса строки с помощью.. Например {name: Предикат "! M" } возвращает массив элементов, имеющих имя свойства не содержащий "М".
Итак, для примера TS что-то вроде этого должно делать:
<ul>
<li ng-repeat="player in players | filter: { name_key: '!FirstPerson' }"></li>
</ul>
Не нужно писать настраиваемые фильтры, не нужно использовать ng-if
с новой областью.
Ответ 3
При реализации ng-repeat
вы можете использовать настраиваемый фильтр. Что-то вроде:
data-ng-repeat="player in players | myfilter:search.name
myfilter.js
:
app.filter('myfilter', function() {
return function( items, name) {
var filtered = [];
angular.forEach(items, function(item) {
if(name == undefined || name == ''){
filtered.push(item);
}
/* only if you want start With*/
// else if(item.name_key.substring(0, name.length) !== name){
// filtered.push(item);
// }
/* if you want contains*/
// else if(item.name_key.indexOf(name) < 0 ){
// filtered.push(item);
// }
/* if you want match full name*/
else if(item.name_key !== name ){
filtered.push(item);
}
});
return filtered;
};
});
Демо Plunker