web-dev-qa-db-ja.com

AngularJS ngリピートハンドル空リストケース

これは非常に一般的なことだと思いましたが、AngularJSでそれを処理する方法を見つけることができませんでした。イベントのリストがあり、それらをAngularJSで出力したいとしましょう。それは非常に簡単です。

<ul>
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>

しかし、リストが空の場合はどうすればいいですか。リストに "No events"などのメッセージボックスが表示されるようにします。 ng-switchevents.lengthを組み合わせた唯一のもの(オブジェクトではなく配列ではない場合に空を確認するにはどうすればよいでしょうか)。

373
Prinzhorn

ngShow を使用できます。

<li ng-show="!events.length">No events</li>

example を参照してください。

または ngHide を使用できます。

<li ng-hide="events.length">No events</li>

example を参照してください。

オブジェクトの場合は Object.keys をテストできます。

565
Artem Andreev

そして、もしこれをフィルターされたリストと一緒に使いたいのであれば、ここにきちんとしたトリックがあります。

<ul>
    <li ng-repeat="item in filteredItems  = (items | filter:keyword)">
        ...
    </li>
</ul>
<div ng-hide="filteredItems.length">No items found</div>

リストが空のときにDOMからulを削除するだけの場合は、 angular-uiディレクティブui-ifをチェックアウトすることをお勧めします。

<ul ui-if="!!events.length">
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>
29
Mortimer

新しいバージョンのangularjsでは、この質問に対する正しい答えは ng-if を使うことです。

<ul>
  <li ng-if="list.length === 0">( No items in this list yet! )</li>
  <li ng-repeat="item in list">{{ item }}</li>
</ul>

リストを定義する必要があり、メッセージを表示するには長さ0でこのリストをダウンロードしようとしているときにも、このソリューションはちらつきません。

これは使用中のそれを示すための略奪者です: http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p=preview

ヒント:ロード中のテキストまたはスピナーを表示することもできます。

  <li ng-if="!list">( Loading... )</li>
29
Pylinux
<ul>
    <li ng-repeat="item in items | filter:keyword as filteredItems">
        ...
    </li>
    <li ng-if="filteredItems.length===0">
        No items found
    </li>
</ul>

これは@Konrad 'ktoso' Malawskiに似ていますが、覚えやすいです。

Angular 1.4でテスト済み

23
Alkaline

これはJavaScript/AngularJSの代わりにCSSを使った別のアプローチです。

CSS:

.emptymsg {
  display: list-item;
}

li + .emptymsg {
  display: none;
}

マークアップ:

<ul>
    <li ng-repeat="item in filteredItems"> ... </li>
    <li class="emptymsg">No items found</li>
</ul>

リストが空の場合、<li ng-repeat = "item in filteredItems">などはコメントアウトされ、li要素の代わりにコメントになります。

6
Miriam Salzer

asキーワードを使用して、ng-repeat要素の下のコレクションを参照できます。

<table>
    <tr ng-repeat="task in tasks | filter:category | filter:query as res">
        <td>{{task.id}}</td>
        <td>{{task.description}}</td>
    </tr>
    <tr ng-if="res.length === 0">
        <td colspan="2">no results</td>
    </tr>
</table>
1

あなたはこのngスイッチを使用することができます:

<div ng-app ng-controller="friendsCtrl">
  <label>Search: </label><input ng-model="searchText" type="text">
  <div ng-init="filtered = (friends | filter:searchText)">
  <h3>'Found '{{(friends | filter:searchText).length}} friends</h3>
  <div ng-switch="(friends | filter:searchText).length">
    <span class="ng-empty" ng-switch-when="0">No friends</span>
    <table ng-switch-default>
      <thead>  
        <tr>
          <th>Name</th>
          <th>Phone</th>
        </tr>
      </thead>
      <tbody>
      <tr ng-repeat="friend in friends | filter:searchText">
        <td>{{friend.name}}</td>
        <td>{{friend.phone}}</td>
      </tr>
    </tbody>
  </table>
</div>
1
LukitaBrands

これはHTMLページではレンダリングされず、検査でHTMLタグが表示されないため、ng-ifを使用できます。

<ul ng-repeat="item in items" ng-if="items.length > 0">
    <li>{{item}}<li>
</ul>
<div class="alert alert-info">there is no items!</div>
0
user7339584

私は通常ng-showを使います

<li ng-show="variable.length"></li>

例えばあなたが定義する変数

<div class="list-group-item" ng-repeat="product in store.products">
   <li ng-show="product.length">show something</li>
</div>
0