AngularJS - ตัวยึดสำหรับผลลัพธ์ว่างจากตัวกรอง


95

ฉันต้องการมีตัวยึดตำแหน่งเช่น<No result>เมื่อผลการกรองกลับเป็นค่าว่าง ใครช่วยได้บ้าง ไม่รู้จะเริ่มตรงไหน ...

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/

ขอบคุณ!



ใช่เคล็ดลับที่ดีกับ ng-show ขอบคุณมาก
Adrian Gunawan

คำตอบ:


252

ปรับเปลี่ยนแนวทางที่ต้องการให้คุณระบุตัวกรองเพียงครั้งเดียว:

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

ซอ


6
นี่เป็นวิธีที่ดีกว่าที่คุณต้องประกาศตัวกรองเพียงครั้งเดียว +1
Tim B James

1
ปัญหาคือ "ไม่มีอะไรที่นี่!" ส่วนหนึ่งถูกแสดงและซ่อนไว้อย่างรวดเร็วจริงๆ เมื่อคุณได้รับข้อมูลพร้อมคำขอ ajax จะเกิดความล่าช้าก่อนที่ข้อมูลที่ส่งคืนจะปรากฏขึ้นและในช่วงเวลานั้นคุณจะเห็นข้อความ "ไม่มีอะไรที่นี่! ส่วนหนึ่งปรากฏขึ้นและหายไป
Temega

@Temega - คุณสามารถเพิ่มคลาส "ng-hide" ใน div ได้
Brian Oliver

3
@Temega คุณสามารถใช้ ng-show = "filteredBars.length === 0"
mantish

ฉันใช้ ng-controller = "FooController เป็น $ ctrl" และทำ "bar ใน $ ctrl.filteredBars = (bars | filter: barFilter)" ดังนั้นฉันจึงสามารถใช้ $ ctrl.filteredBars.length นอก ng-repeat ขอบคุณสำหรับคำใบ้มหากาพย์นี้!
xlttj

37

นี่คือเคล็ดลับโดยใช้ 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
แต่ในกรณีนี้ตัวกรองถูกเรียกใช้สองครั้งมีวิธีหลีกเลี่ยงหรือไม่?
อิสยาห์

ขอบคุณสำหรับการแก้ปัญหานี้ ฉันใช้ตัวกรอง groupBy ที่ให้ไว้ที่นี่github.com/a8m/angular-filterแต่น่าเสียดายที่คำตอบที่ยอมรับข้างต้นใช้งานไม่ได้ วิธีนี้อาจเรียกใช้ตัวกรองสองครั้ง แต่แก้ไขปัญหาได้โดยไม่คำนึงถึง
Anthony

ในกรณีของฉันมันใช้งานได้โดยไม่มี "== 0" <p ng-show = "(bars | filter: barFilter) .length"> ไม่มีอะไรเลย! </p>
Alessio

22

นำมาจากเอกสารอย่างเป็นทางการนี้ว่าพวกเขาทำอย่างไร:

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

จากนั้นใช้ผลลัพธ์เป็นอาร์เรย์

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

ตัวอย่างเต็ม:

<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
ฉันสงสัยว่ามีการเปลี่ยนแปลงอะไรบ้างเนื่องจากคำถามนี้ถูกถามครั้งแรก แต่เนื่องจากตอนนี้เป็นวิธีที่เอกสารของ Angular แนะนำให้คุณแก้ปัญหาฉันจะบอกว่านี่เป็นวิธีที่ถูกต้องในการดำเนินการ ณ จุดนี้
jackel414

1
ฉันไม่พบตัวอย่างอื่น สิ่งนี้ถูก "ซ่อน" ในเอกสารแอนิเมชันของพวกเขาและบังเอิญว่าฉันสังเกตเห็นมันในวันเดียวกันฉันต้องการมันหรือฉันไม่คิดว่าฉันจะจำได้
caiocpricci2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.