AngularJS - placeholder untuk hasil kosong dari filter


95

Saya ingin memiliki placeholder, misalnya <No result>saat hasil filter kembali kosong. Adakah yang bisa membantu? Aku bahkan tidak tahu harus mulai dari mana ...

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/

Terima kasih!



ah ya trik bagus dengan ng-show. Terima kasih banyak
Adrian Gunawan

Jawaban:


252

Perubahan pada pendekatan yang hanya mengharuskan Anda menentukan filter sekali:

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

Biola


6
Ini adalah solusi yang lebih baik karena Anda hanya perlu mendeklarasikan filter Anda sekali. +1
Tim B James

1
Masalahnya adalah bahwa "Tidak ada apa-apa di sini!" bagian ditampilkan dan disembunyikan dengan sangat cepat. Ketika Anda mendapatkan data dengan permintaan ajax, ada penundaan sebelum data yang dikembalikan ditampilkan dan dalam waktu itu Anda dapat melihat pesan "Tidak ada di sini!" bagian muncul dan menghilang.
Temega

@Temega - Anda dapat menambahkan kelas "ng-hide" ke div
Brian Oliver

3
@Temega Anda bisa menggunakan ng-show = "filteredBars.length === 0"
mantish

Saya menggunakan ng-controller = "FooController sebagai $ ctrl" dan melakukan "bar di $ ctrl.filteredBars = (bars | filter: barFilter)" jadi saya bahkan bisa menggunakan $ ctrl.filteredBars.length di luar ng-repeat. Terima kasih atas petunjuk epik ini!
xlttj

37

Berikut trik menggunakan 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
Tetapi dalam kasus ini filter dijalankan dua kali, apakah ada cara untuk menghindarinya?
Isaiah

Terima kasih untuk solusi ini. Saya telah menggunakan filter groupBy yang disediakan di sini github.com/a8m/angular-filter tetapi sayangnya jawaban yang diterima di atas tidak berfungsi. Metode ini dapat mengeksekusi filter dua kali tetapi tetap saja menyelesaikan masalah.
Anthony

Dalam kasus saya, ini berfungsi tanpa "== 0". <p ng-show = "(bars | filter: barFilter) .length"> Tidak ada di sini! </p>
Alessio

22

Diambil dari ini dokumen resmi itu bagaimana mereka melakukannya:

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

Kemudian gunakan hasilnya sebagai array

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

Cuplikan lengkap:

<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
Saya curiga banyak hal berubah sejak pertanyaan ini pertama kali ditanyakan, tetapi mengingat bahwa saat ini persis seperti yang disarankan oleh dokumen Angular untuk Anda menyelesaikan masalah, saya akan mengatakan ini adalah cara yang tepat untuk pergi pada saat ini.
jackel414

1
Saya tidak dapat menemukan contoh lain. Ini "tersembunyi", dalam dokumentasi animasi mereka dan kebetulan saya menyadarinya pada hari yang sama saya membutuhkannya atau saya rasa saya tidak akan ingat.
caiocpricci2
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.