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!

Adrian Gunawan
sumber
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

Mark Rajcok
sumber
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/

Adrian Gunawan
sumber
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>
caiocpricci2.dll
sumber
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