Угловой.js. Как подсчитать итерации ng-repeat, которые удовлетворяют пользовательскому фильтру

Вот мой код:

<div ng-show="?" ng-repeat="item in items | notEmpty">
</div>

Фильтр:

Kb.filter("notEmpty", function(){ 
  return function(input){
    var output=[];
    for(var i=0;i<input.length;i++){
      if(input[i]){
        output.push(input[i]);
      }
    }
    return output;
}});

Мне нужно показать/скрыть повторяющиеся s в соответствии с количеством отфильтрованных элементов в цикле. Как лучше всего это сделать?

Спасибо


person Fyodor Khruschov    schedule 29.10.2013    source источник


Ответы (4)


Выражение ng-repeat позволяет назначать отфильтрованные результаты переменной. Эта переменная будет доступна из текущей области, поэтому вы можете использовать ее в той же области в любом случае:

<p>Number of filtered items: {{filteredItems.length}}</p>

<div 
  ng-show="filteredItems.length > 0" 
  ng-repeat="item in filteredItems = (items | notEmpty)"
>
 {{$index}}
</div>
person Stewie    schedule 29.10.2013
comment
Спасибо. Я не знал, что могу сделать такой синтаксис: ng-repeat="item in filteredItems = (items | notEmpty) - person Fyodor Khruschov; 29.10.2013
comment
Спасибо! не верится, что у нас был такой синтаксис - person Hieu Pham; 07.03.2015
comment
Кто вообще мог изобрести такой синтаксис? Сумасшедший, не так ли? <div ng-repeat="entry in filteredItemCounters[$index] = (day.items | filter:filterItemsFn) | orderBy:['-meta.ago', 'meta.review', 'meta.star', '-orig.iso']" ng-init="orig=entry.orig; meta=entry.meta;"> - person Daniel F; 07.09.2015
comment
Начиная с Angular 1.3 вы можете использовать variable in expression as alias_expression - person Gaël J; 01.06.2016
comment
Идеально. Работал, как ожидалось. Спасибо. - person Shiva Avula; 19.06.2016

Самый простой способ — запустить фильтр в вашем контроллере. Что-то вроде этого:

function MyCtrl($scope, notEmptyFilter)
{
    //$scope.items is put into the scope somehow
    $scope.filteredItems = notEmptyFilter($scope.items);
}

Тогда ваш HTML будет выглядеть примерно так:

<div ng-show="filteredItems.length > 0" ng-repeat="item in filteredItems">
</div>
person dnc253    schedule 29.10.2013

Начиная с Angular 1.3 вы можете использовать следующий синтаксис для ng-repeat:

variable in expression as alias_expression

То есть:

<p>Number of filtered items: {{filteredItems.length}}</p>

<div ng-repeat="item in items | notEmpty as filteredItems">
 ...
</div>
person Gaël J    schedule 01.06.2016