Подтвердить что ты не робот

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 Попытка

4b9b3361

Ответ 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