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!

Adrian Gunawan
źródło
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

Mark Rajcok
źródło
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/

Adrian Gunawan
źródło
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>
caiocpricci2
źródło
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