AngularJS - filtreden boş sonuç için yer tutucu


95

Bir yer tutucunun olmasını istiyorum, örneğin <No result>filtre sonucu boş döndüğünde. Biri lütfen yardım edebilir mi? Nereden başlayacağımı bile bilmiyorum ...

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/

Teşekkürler!



Ah evet, ng-show ile güzel bir numara. Çok teşekkürler
Adrian Gunawan

Yanıtlar:


252

Filtreyi yalnızca bir kez belirtmenizi gerektiren yaklaşımda bir ince ayar:

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

Vaktini boşa harcamak


6
Bu, filtrenizi yalnızca bir kez beyan etmeniz gerektiğinden daha güzel bir çözümdür. +1
Tim B James

1
Sorun şu ki "Burada hiçbir şey yok!" bölüm gerçekten hızlı bir şekilde gösterilir ve gizlenir. Bir ajax isteği ile veri aldığınızda, döndürülen verilerin gösterilmesinden önce bir gecikme olur ve bu süre içinde "Burada hiçbir şey yok!" kısım görünür ve kaybolur.
Temega

@Temega - div'e bir "ng-hide" sınıfı ekleyebilirsiniz
Brian Oliver

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

Ng-controller = "FooController'ı $ ctrl olarak kullandım ve $ ctrl.filteredBars = (bars | filter: barFilter)" içinde "bar yaptım" böylece ng-tekrarının dışında $ ctrl.filteredBars.length bile kullanabilirdim. Bu destansı ipucu için teşekkürler!
xlttj

37

İşte ng-show kullanan numara

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
Ancak bu durumda filtre iki kez çalıştırılır, bundan kaçınmanın bir yolu var mı?
Isaiah

Bu çözüm için teşekkürler. Burada sağlanan groupBy filtresini github.com/a8m/angular-filter kullanıyorum ancak maalesef yukarıdaki kabul edilen cevap çalışmıyor. Bu yöntem, filtreyi iki kez çalıştırabilir, ancak sorunu ne olursa olsun çözdü.
Anthony

Benim durumumda "== 0" olmadan çalışır. <p ng-show = "(bars | filter: barFilter) .length"> Burada hiçbir şey yok! </p>
Alessio

22

Alındığı bu onlar bunun için gereken adımları resmi belgede:

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

Ardından sonuçları bir dizi olarak kullanın

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

Tam pasaj:

<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
Bu soru ilk sorulduğundan beri bazı şeylerin değiştiğinden şüpheleniyorum, ancak şu anda Angular'ın belgelerinin sorunu çözmenizi önerdiği düşünüldüğünde, bunun bu noktada gitmenin doğru yolu olduğunu söyleyebilirim.
jackel414

1
Başka bir örnek bulamadım. Bu, animasyon belgelerinde "gizli" ve şans eseri onu ihtiyacım olduğu gün fark ettim ya da hatırlayacağımı düşünmüyorum.
caiocpricci2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.