AngularJS ng-repeat handle empty list case
我原以为这是一件很平常的事情,但在安古拉吉斯我找不到如何处理它。假设我有一个事件列表,想要用AngularJS输出它们,那么这很容易:
1 2 3 4 5 6 7 | <ul> <li ng-repeat="event in events">{{event.title}} </li> </ul> |
但是,当列表为空时,如何处理该案例?我想在列表中放置一个带有"无事件"或类似内容的消息框。唯一能接近的是带
你可以使用ngshow。
1 2 | <li ng-show="!events.length">No events </li> |
参见示例。
或者你可以用nghide
1 2 | <li ng-hide="events.length">No events </li> |
参见示例。
对于对象,可以测试object.keys。
如果你想在过滤列表中使用这个,这里有一个很好的技巧:
1 2 3 4 5 6 7 8 9 10 11 | <ul> <li ng-repeat="item in filteredItems = (items | filter:keyword)"> ... </li> </ul> No items found |
对于新版AngularJS,正确答案是使用
1 2 3 4 5 6 7 8 9 10 | <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/in7ha1wtlpuvgamiobles?P=预览
提示:您还可以显示加载文本或微调器:
1 2 | <li ng-if="!list">( Loading... ) </li> |
如果您只想在列表为空时从dom中删除
1 2 3 4 5 6 | <ul ui-if="!!events.length"> <li ng-repeat="event in events">{{event.title}} </li> </ul> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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,但稍微容易记住。
用角度1.4测试
这里有一种使用CSS而不是JavaScript/AngularJS的不同方法。
CSS:
1 2 3 4 5 6 7 | .emptymsg { display: list-item; } li + .emptymsg { display: none; } |
Markup:
1 2 3 4 5 6 7 8 9 10 | <ul> <li ng-repeat="item in filteredItems"> ... </li> <li class="emptymsg">No items found </li> </ul> |
如果列表为空,
可以使用
1 2 3 4 5 6 7 8 9 | <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开关:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <label>Search: </label><input ng-model="searchText" type="text"> 'Found '{{(friends | filter:searchText).length}} friends <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> |
您可以使用ng-if,因为它不在HTML页面中呈现,并且在inspect中看不到您的HTML标记…
1 2 3 4 5 6 7 8 9 10 | <ul ng-repeat="item in items" ng-if="items.length > 0"> <li> {{item}} <li> </ul> there is no items! |
我通常用NG表演
1 2 | <li ng-show="variable.length"> </li> |
例如,定义的变量
1 2 | <li ng-show="product.length">show something </li> |