AngularJS - espace réservé pour le résultat vide du filtre

95

Je veux avoir un espace réservé, par exemple <No result>lorsque le résultat du filtre retourne vide. Quelqu'un pourrait-il s'il vous plaît aider? Je ne sais même pas par où commencer...

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/

Merci!

Adrian Gunawan
la source
ah ouais belle astuce avec ng-show. Merci beaucoup
Adrian Gunawan

Réponses:

252

Une modification de l'approche qui ne vous oblige à spécifier le filtre qu'une seule fois:

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

Violon

Mark Rajcok
la source
6
C'est la meilleure solution dans la mesure où vous ne devez déclarer votre filtre qu'une seule fois. +1
Tim B James
1
Le problème est que le "Rien ici!" une partie est montrée et cachée très rapidement. Lorsque vous obtenez des données avec une requête ajax, il y a un délai avant que les données renvoyées ne soient affichées et pendant ce temps, vous pouvez voir le "Rien ici!" une partie apparaît et disparaît.
Temega
@Temega - vous pourriez ajouter une classe "ng-hide" au div
Brian Oliver
3
@Temega Vous pouvez utiliser ng-show = "
filteredBars.length
J'utilise ng-controller = "FooController as $ ctrl" et j'ai fait "bar in $ ctrl.filteredBars = (bars | filter: barFilter)" afin que je puisse même utiliser $ ctrl.filteredBars.length en dehors du ng-repeat. Merci pour cet indice épique!
xlttj
37

Voici l'astuce en utilisant 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/

Adrian Gunawan
la source
2
Mais dans ce cas, le filtre est exécuté deux fois, y a-t-il un moyen d'éviter cela?
Isaiah
Merci pour cette solution. J'utilise le filtre groupBy fourni ici github.com/a8m/angular-filter mais malheureusement la réponse acceptée ci-dessus ne fonctionne pas. Cette méthode peut exécuter le filtre deux fois, mais elle résout le problème malgré tout.
Anthony
Dans mon cas, cela fonctionne sans le "== 0". <p ng-show = "(bars | filter: barFilter) .length"> Rien ici! </p>
Alessio
22

Tiré de ce document officiel, voici comment ils le font:

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

Ensuite, utilisez les résultats sous forme de tableau

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

Extrait complet:

<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>
caiocpricci2
la source
4
Je soupçonne que les choses ont changé depuis que cette question a été posée pour la première fois, mais étant donné qu'actuellement, c'est exactement ainsi que les documents d'Angular vous suggèrent de résoudre le problème, je dirais que c'est la bonne façon de procéder à ce stade.
jackel414
1
Je n'ai pas trouvé d'autre exemple. C'est "caché", dans leur documentation d'animation et c'est par hasard que je l'ai remarqué le jour même où j'en avais besoin ou je ne pense pas que je m'en serais souvenu.
caiocpricci2