AngularJS - заповнювач для порожнього результату з фільтра


95

Я хочу мати власник місця, наприклад, <No result>коли результат фільтру повертається порожнім. Хтось може допомогти? Навіть не знаю, з чого почати ...

HTML :

<div ng-controller="Ctrl">
<h1>My Foo</h1>
<ul>
    <li ng-repeat="foo in foos">
        <a href="#" ng-click="setBarFilter(foo.name)">{{foo.name}}</a>
    </li>
</ul>
<br />
<h1>My Bar</h1>
<ul>
    <li ng-repeat="bar in bars | filter:barFilter">{{bar.name}}</li>
</ul>

</div>

JS :

function Ctrl($scope) {

  $scope.foos = [{
    name: 'Foo 1'
  },{
    name: 'Foo 2'
  },{
    name: 'Foo 3'
  }];

  $scope.bars = [{
    name: 'Bar 1',
    foo: 'Foo 1'
  },{
    name: 'Bar 2',
    foo: 'Foo 2'
  }];

  $scope.setBarFilter = function(foo_name) {
    $scope.barFilter = {};
    $scope.barFilter.foo = foo_name;
  }
}

jsFiddle : http://jsfiddle.net/adrn/PEumV/1/

Дякую!



ах так, приємний фокус з ng-show. Велике спасибі
Адріан Гунаван

Відповіді:


252

Тік підходу, який вимагає лише одного разу вказати фільтр:

  <li ng-repeat="bar in filteredBars = (bars | filter:barFilter)">{{bar.name}}</li>
</ul>
<p ng-hide="filteredBars.length">Nothing here!</p>

Скрипка


6
Це найкраще рішення, оскільки вам потрібно лише один раз оголосити свій фільтр. +1
Тім Б Джеймс

1
Проблема в тому, що "Тут нічого немає!" частина відображається і приховується дуже швидко. Коли ви отримуєте дані із запитом ajax, перед відображенням повернутих даних виникає затримка, і за цей час ви можете побачити "Тут нічого немає!" частина з'являється і зникає.
Темега

@Temega - ви можете додати клас "ng-hide" до div
Брайан Олівер,

3
@Temega Ви можете використати ng-show = "filteredBars.length === 0"
mantish

Я використовую ng-controller = "FooController як $ ctrl" і зробив "bar in $ ctrl.filteredBars = (bars | filter: barFilter)", щоб я міг навіть використовувати $ ctrl.filteredBars.length поза ng-repeat. Дякуємо за цей епічний підказку!
xlttj

37

Ось фокус за допомогою ng-show

HTML:

<div ng-controller="Ctrl">
<h1>My Foo</h1>
<ul>
    <li ng-repeat="foo in foos">
        <a href="#" ng-click="setBarFilter(foo.name)">{{foo.name}}</a>
    </li>
</ul>
<br />
<h1>My Bar</h1>
<ul>
    <li ng-repeat="bar in bars | filter:barFilter">{{bar.name}}</li>
</ul>
<p ng-show="(bars | filter:barFilter).length == 0">Nothing here!</p>

</div>

jsFiddle: http://jsfiddle.net/adrn/PEumV/2/


2
Але в цьому випадку фільтр виконується двічі, чи є спосіб уникнути цього?
Ісая

Дякую за це рішення. Я використовую фільтр groupBy, наданий тут github.com/a8m/angular-filter, але, на жаль, прийнята відповідь вище не працює. Цей метод може виконати фільтр двічі, але незалежно від цього він вирішив проблему.
Ентоні

У моєму випадку це працює без "== 0". <p ng-show = "(bars | filter: barFilter) .length"> Тут нічого! </p>
Алессіо,

22

Взяте з цього офіційного документа, ось як вони це роблять:

ng-repeat="friend in friends | filter:q as results"

Потім використовуйте результати як масив

<li class="animate-repeat" ng-if="results.length == 0">
  <strong>No results found...</strong>
</li>

Повний опис:

<div ng-controller="repeatController">
I have {{friends.length}} friends. They are:
<input type="search" ng-model="q" placeholder="filter friends..." aria-label="filter friends" />


<ul class="example-animate-container">
    <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
      [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
    </li>
    <li class="animate-repeat" ng-if="results.length == 0">
      <strong>No results found...</strong>
    </li>
  </ul>
</div>

4
Я підозрюю, що все змінилося з моменту першого запитання, але враховуючи, що наразі саме так, як документи Angular пропонують вам вирішити проблему, я б сказав, що це правильний шлях на даний момент.
jackel414

1
Я не міг знайти іншого прикладу. Це "приховано", в їх анімаційній документації, і випадково я помітив це того самого дня, коли мені це було потрібно, або, думаю, не пам'ятав би.
caiocpricci2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.