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;
  }
}

jsFiddlehttp : //jsfiddle.net/adrn/PEumV/1/

ありがとう!



ああ、ng-showを使った素晴らしいトリック。どうもありがとう
Adrian Gunawan 2013年

回答:


252

フィルターを一度だけ指定する必要があるアプローチの微調整:

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

フィドル


6
これは、フィルターを1回だけ宣言する必要があるという点で優れたソリューションです。+1
Tim B James

1
問題は、「ここには何もない」ということです。パーツは非常に迅速に表示および非表示になります。ajaxリクエストでデータを取得すると、返されたデータが表示されるまでに遅延があり、その間に「ここには何もありません」と表示されます。一部が現れたり消えたりします。
テメガ2014年

@Temega-divにクラス "ng-hide"を追加できます
ブライアンオリバー

3
@Temega ng-show = "filteredBars.length === 0"を使用することができます
強制的に2014

私はng-controller = "FooController as $ ctrl"を使用し、 "bar in $ ctrl.filteredBars =(bars | filter:barFilter)"を実行したため、ng-repeatの外側で$ ctrl.filteredBars.lengthを使用することもできました。この壮大なヒントをありがとう!
xlttj 2017

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
しかし、この場合、フィルターは2回実行されますが、それを回避する方法はありますか?
イザヤ

この解決策をありがとう。ここで提供されているgroupByフィルターを使用していますgithub.com/a8m/angular-filter残念ながら、上記の受け入れられた回答は機能しません。この方法では、フィルターが2回実行される可能性がありますが、問題は解決されました。
Anthony

私の場合、 "== 0"がなくても機能します。<p ng-show = "(bars | filter:barFilter).length">ここには何もありません!</ p>
アレッシオ、

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.