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!



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


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/


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>

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.