AngularJS - symbol zastępczy dla pustego wyniku z filtru


95

Chcę mieć symbol zastępczy, np. <No result>Gdy wynik filtru jest pusty. Czy ktoś mógłby pomóc? Nie wiem nawet, od czego zacząć ...

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/

Dzięki!



ach tak niezła sztuczka z ng-show. Bardzo dziękuję
Adrian Gunawan

Odpowiedzi:


252

Ulepszenie podejścia, które wymaga tylko jednorazowego określenia filtra:

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

Skrzypce


6
Jest to lepsze rozwiązanie, ponieważ wystarczy raz zadeklarować filtr. +1
Tim B James

1
Problem w tym, że komunikat „Nic tu nie ma!” część jest bardzo szybko pokazywana i ukrywana. Kiedy otrzymujesz dane z żądaniem AJAX, występuje opóźnienie, zanim zwrócone dane zostaną pokazane iw tym czasie możesz zobaczyć "Nic tutaj!" część pojawia się i znika.
Temega

@Temega - możesz dodać klasę „ng-hide” do div
Brian Oliver.

3
@Temega Możesz użyć ng-show = "
filterBars.length

Używam ng-controller = "FooController as $ ctrl" i zrobiłem "bar in $ ctrl.filteredBars = (bars | filter: barFilter)", więc mógłbym nawet użyć $ ctrl.filteredBars.length poza ng-repeat. Dzięki za tę epicką wskazówkę!
xlttj

37

Oto sztuczka z użyciem 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
Ale w tym przypadku filtr jest wykonywany dwukrotnie, czy jest sposób, aby tego uniknąć?
Izajasz

Dzięki za to rozwiązanie. Korzystałem z filtra groupBy podanego tutaj github.com/a8m/angular-filter, ale niestety zaakceptowana powyżej odpowiedź nie działa. Ta metoda może wykonać filtr dwukrotnie, ale i tak rozwiązała problem.
Anthony

W moim przypadku działa bez "== 0". <p ng-show = "(bars | filter: barFilter) .length"> Nic tu nie ma! </p>
Alessio

22

Zaczerpnięte z tego oficjalnego dokumentu, tak to robią:

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

Następnie użyj wyników jako tablicy

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

Pełny fragment:

<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
Podejrzewam, że sytuacja się zmieniła od czasu, gdy po raz pierwszy zadano to pytanie, ale biorąc pod uwagę, że obecnie doktorzy Angulara sugerują, aby rozwiązać ten problem, powiedziałbym, że jest to właściwa droga w tym momencie.
jackel414

1
Nie mogłem znaleźć innego przykładu. Jest to „ukryte” w ich dokumentacji animacji i przypadkiem zauważyłem to tego samego dnia, w którym tego potrzebowałem, albo nie sądzę, żebym zapamiętał.
caiocpricci2
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.