AngularJS - segnaposto per il risultato vuoto dal filtro


95

Voglio avere un segnaposto, ad esempio <No result>quando il risultato del filtro ritorna vuoto. Qualcuno potrebbe aiutare per favore? Non so nemmeno da dove cominciare ...

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/

Grazie!



ah sì bel trucco con ng-show. Grazie mille
Adrian Gunawan

Risposte:


252

Un tweak sull'approccio che richiede solo di specificare il filtro una volta:

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

Violino


6
Questa è la soluzione migliore in quanto è necessario dichiarare il filtro solo una volta. +1
Tim B James

1
Il problema è che il "Niente qui!" parte viene mostrata e nascosta molto rapidamente. Quando ricevi dati con una richiesta ajax, c'è un ritardo prima che i dati restituiti vengano mostrati e in quel lasso di tempo puoi vedere il messaggio "Niente qui!" una parte appare e scompare.
Temega

@Temega - potresti aggiungere una classe "ng-hide" al div
Brian Oliver

3
@Temega Potresti usare ng-show = "filteredBars.length === 0"
mantish

Uso ng-controller = "FooController as $ ctrl" e ho fatto "bar in $ ctrl.filteredBars = (bars | filter: barFilter)" in modo da poter utilizzare $ ctrl.filteredBars.length al di fuori di ng-repeat. Grazie per questo suggerimento epico!
xlttj

37

Ecco il trucco usando 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
Ma in questo caso il filtro viene eseguito due volte, c'è un modo per evitarlo?
Isaia

Grazie per questa soluzione. Ho utilizzato il filtro groupBy fornito qui github.com/a8m/angular-filter ma sfortunatamente la risposta accettata sopra non funziona. Questo metodo può eseguire il filtro due volte ma ha risolto il problema a prescindere.
Anthony

Nel mio caso funziona senza "== 0". <p ng-show = "(bars | filter: barFilter) .length"> Niente qui! </p>
Alessio

22

Tratto da questo documento ufficiale è così che lo fanno:

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

Quindi utilizza i risultati come un array

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

Snippet completo:

<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
Sospetto che le cose siano cambiate da quando questa domanda è stata posta per la prima volta, ma dato che attualmente questo è esattamente il modo in cui i documenti di Angular ti suggeriscono di risolvere il problema, direi che questa è la strada giusta a questo punto.
jackel414

1
Non sono riuscito a trovare un altro esempio. Questo è "nascosto", nella loro documentazione di animazione ed è stato per caso che l'ho notato lo stesso giorno in cui ne avevo bisogno o non credo che me lo sarei ricordato.
caiocpricci2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.