AngularJS ng-repeat处理空列表大小写

我认为这将是一个非常常见的事情,但我不知道如何在AngularJS中处理它。假设我有一个事件列表,想用AngularJS输出它们,这很简单:

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

但是当列表为空时,我如何处理这种情况呢?我想有一个消息框的地方,列表是类似于“没有事件”或类似的东西。唯一接近的是ng-switchevents.length(当一个对象而不是数组时,我如何检查是否为空?),但这真的是我唯一的选择吗?

237465 次浏览

你可以使用ngShow

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

看到例子

或者你可以使用ngHide

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

看到例子

对于object,可以测试

如果你只是想在列表为空时从DOM中删除ul,你可能想检查angular-ui指令 ui-if:

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

如果你想在过滤列表中使用这个,这里有一个巧妙的技巧:

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

对于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测试

你可以使用ng-switch:

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

下面是一种使用CSS代替JavaScript/AngularJS的不同方法。

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元素。

我通常使用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>

你可以使用ng-if,因为这不是呈现在HTML页面,你不会看到你的HTML标签在inspect…

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

你可以使用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>