AngularJS - trình giữ chỗ cho kết quả trống từ bộ lọc


95

Tôi muốn có một trình giữ chỗ, ví dụ: <No result>khi kết quả bộ lọc trả về trống. Bất cứ ai có thể vui lòng giúp đỡ? Tôi thậm chí không biết bắt đầu từ đâu ...

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/

Cảm ơn!



à đúng rồi, mẹo hay với ng-show. Cảm ơn rất nhiều
Adrian Gunawan

Câu trả lời:


252

Một chỉnh sửa về phương pháp chỉ yêu cầu bạn chỉ định bộ lọc một lần:

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

Vĩ cầm


6
Đây là giải pháp tốt hơn ở chỗ bạn chỉ cần khai báo bộ lọc của mình một lần. +1
Tim B James

1
Vấn đề là "Không có gì ở đây!" một phần được hiển thị và ẩn thực sự nhanh chóng. Khi bạn nhận dữ liệu với một yêu cầu ajax, sẽ có độ trễ trước khi dữ liệu trả về được hiển thị và trong thời gian đó, bạn có thể thấy thông báo "Không có gì ở đây!" một phần xuất hiện và biến mất.
Temega

@Temega - bạn có thể thêm một lớp "ng-hide" để div
Brian Oliver

3
@Temega Bạn có thể sử dụng ng-show = "
filterBars.length

Tôi sử dụng ng-controller = "FooController dưới dạng $ ctrl" và đã làm "thanh trong $ ctrl.filteredBars = (bar | filter: barFilter)" để tôi thậm chí có thể sử dụng $ ctrl.filteredBars.length bên ngoài ng-repeat. Cảm ơn vì gợi ý sử thi này!
xlttj

37

Đây là thủ thuật sử dụng 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
Nhưng trong trường hợp này bộ lọc được thực thi hai lần, có cách nào để tránh điều đó không?
Isaiah

Cảm ơn cho giải pháp này. Tôi đã sử dụng bộ lọc groupBy được cung cấp tại đây github.com/a8m/angular-filter nhưng rất tiếc câu trả lời được chấp nhận ở trên không hoạt động. Phương pháp này có thể thực thi bộ lọc hai lần nhưng nó đã giải quyết được vấn đề.
Anthony

Trong trường hợp của tôi, nó hoạt động mà không có "== 0". <p ng-show = "(bar | filter: barFilter) .length"> Không có gì ở đây! </p>
Alessio

22

Lấy từ tài liệu chính thức này , đó là cách họ thực hiện:

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

Sau đó, sử dụng kết quả dưới dạng một mảng

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

Đoạn mã đầy đủ:

<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
Tôi nghi ngờ mọi thứ đã thay đổi kể từ khi câu hỏi này lần đầu tiên được hỏi, nhưng hiện tại đây chính xác là cách tài liệu của Angular đề xuất bạn giải quyết vấn đề, tôi sẽ nói rằng đây là cách đúng đắn để đi vào thời điểm này.
jackel414,

1
Tôi không thể tìm thấy một ví dụ khác. Điều này được "ẩn", trong tài liệu hoạt hình của họ và tình cờ là tôi nhận thấy nó vào đúng ngày tôi cần nó hoặc tôi không nghĩ rằng tôi sẽ nhớ.
caiocpricci2 30/08/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.