AngularJS - Platzhalter für leeres Ergebnis des Filters

95

Ich möchte einen Platzhalter haben, z. B. <No result>wenn das Filterergebnis leer ist. Könnte jemand bitte helfen? Ich weiß nicht einmal, wo ich anfangen soll ...

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/

Vielen Dank!

Adrian Gunawan
quelle
ah yeah schöner Trick mit ng-show. Vielen Dank
Adrian Gunawan

Antworten:

252

Eine Optimierung des Ansatzes, bei der Sie den Filter nur einmal angeben müssen:

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

Geige

Mark Rajcok
quelle
6
Dies ist die schönere Lösung, da Sie Ihren Filter nur einmal deklarieren müssen. +1
Tim B James
1
Das Problem ist, dass das "Nichts hier!" Teil wird sehr schnell angezeigt und ausgeblendet. Wenn Sie Daten mit einer Ajax-Anfrage erhalten, gibt es eine Verzögerung, bevor die zurückgegebenen Daten angezeigt werden, und in dieser Zeit können Sie das "Nichts hier!" Teil erscheinen und verschwinden.
Temega
@Temega - Sie könnten eine Klasse "ng-hide" zum div hinzufügen
Brian Oliver
3
@Temega Sie könnten ng-show = "filteredBars.length === 0"
Mantish
Ich verwende ng-controller = "FooController als $ ctrl" und habe "bar in $ ctrl.filteredBars = (Balken | filter: barFilter)" verwendet, damit ich sogar $ ctrl.filteredBars.length außerhalb der ng-Wiederholung verwenden kann. Danke für diesen epischen Hinweis!
xlttj
37

Hier ist der Trick mit 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
quelle
2
Aber in diesem Fall wird der Filter zweimal ausgeführt. Gibt es eine Möglichkeit, dies zu vermeiden?
Jesaja
Danke für diese Lösung. Ich habe den hier bereitgestellten groupBy-Filter verwendet, github.com/a8m/angular-filter, aber leider funktioniert die oben akzeptierte Antwort nicht. Diese Methode kann den Filter zweimal ausführen, hat das Problem jedoch trotzdem gelöst.
Anthony
In meinem Fall funktioniert es ohne die "== 0". <p ng-show = "(Balken | Filter: barFilter) .Länge"> Nichts hier! </ p>
Alessio
22

Aus diesem offiziellen Dokument entnommen , machen sie das so:

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

Verwenden Sie dann die Ergebnisse als Array

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

Vollständiger Ausschnitt:

<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
quelle
4
Ich vermute, dass sich die Dinge geändert haben, seit diese Frage zum ersten Mal gestellt wurde, aber da Angulars Dokumente derzeit genau so vorschlagen, dass Sie das Problem lösen, würde ich sagen, dass dies an dieser Stelle der richtige Weg ist.
jackel414
1
Ich konnte kein anderes Beispiel finden. Dies ist in ihrer Animationsdokumentation "versteckt" und es war Zufall, dass ich es am selben Tag bemerkte, an dem ich es brauchte, oder ich glaube nicht, dass ich mich daran erinnert hätte.
Caiocpricci2