これは非常に一般的なことだと思いましたが、AngularJSでそれを処理する方法を見つけることができませんでした。イベントのリストがあり、それらをAngularJSで出力したいとしましょう。それは非常に簡単です。
<ul>
<li ng-repeat="event in events">{{event.title}}</li>
</ul>
しかし、リストが空の場合はどうすればいいですか。リストに "No events"などのメッセージボックスが表示されるようにします。 ng-switch
とevents.length
を組み合わせた唯一のもの(オブジェクトではなく配列ではない場合に空を確認するにはどうすればよいでしょうか)。
ngShow を使用できます。
<li ng-show="!events.length">No events</li>
example を参照してください。
または ngHide を使用できます。
<li ng-hide="events.length">No events</li>
example を参照してください。
オブジェクトの場合は Object.keys をテストできます。
そして、もしこれをフィルターされたリストと一緒に使いたいのであれば、ここにきちんとしたトリックがあります。
<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>
新しいバージョンの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>
<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でテスト済み
これは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要素の代わりにコメントになります。
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>
あなたはこの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>
これは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>
私は通常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>