javascript - example - AngularJS ng-repeat manejar el caso de la lista vacía
ng-repeat filter (9)
Pensé que esto sería algo muy común, pero no pude encontrar cómo manejarlo en AngularJS. Digamos que tengo una lista de eventos y quiero mostrarlos con AngularJS, entonces eso es bastante fácil:
<ul>
<li ng-repeat="event in events">{{event.title}}</li>
</ul>
Pero, ¿cómo manejo el caso cuando la lista está vacía? Quiero tener un cuadro de mensaje en el lugar donde esté la lista con algo como "Sin eventos" o similar. Lo único que se events.length
es el ng-switch
con events.length
(¿cómo events.length
si está vacío cuando hay un objeto y no una matriz?), Pero ¿es esa realmente la única opción que tengo?
Aquí hay un enfoque diferente usando CSS en lugar de JavaScript / AngularJS.
CSS:
.emptymsg {
display: list-item;
}
li + .emptymsg {
display: none;
}
Margen:
<ul>
<li ng-repeat="item in filteredItems"> ... </li>
<li class="emptymsg">No items found</li>
</ul>
Si la lista está vacía, <li ng-repeat = "item in filterItems">, etc. será comentado y se convertirá en un comentario en lugar de un elemento li.
Con las versiones más recientes de angularjs, la respuesta correcta a esta pregunta es usar 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>
Esta solución no parpadeará cuando la lista esté a punto de descargarse porque la lista debe estar definida y con una longitud de 0 para que se muestre el mensaje.
Aquí hay un desplumador para mostrarlo en uso: http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p=preview
Sugerencia: También puede mostrar un texto de carga o una rueda giratoria:
<li ng-if="!list">( Loading... )</li>
Es posible que desee revisar la directiva ui-if
angular de ui si desea eliminar la ul
del DOM cuando la lista está vacía:
<ul ui-if="!!events.length">
<li ng-repeat="event in events">{{event.title}}</li>
</ul>
Puede utilizar este interruptor 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>
Y si quieres usar esto con una lista filtrada, aquí hay un buen truco:
<ul>
<li ng-repeat="item in filteredItems = (items | filter:keyword)">
...
</li>
</ul>
<div ng-hide="filteredItems.length">No items found</div>
normalmente uso ng-show
<li ng-show="variable.length"></li>
donde se define la variable por ejemplo
<div class="list-group-item" ng-repeat="product in store.products">
<li ng-show="product.length">show something</li>
</div>
puede usar ng-if porque esto no se procesa en la página html y no ve su etiqueta html en inspeccionar ...
<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>
<ul>
<li ng-repeat="item in items | filter:keyword as filteredItems">
...
</li>
<li ng-if="filteredItems.length===0">
No items found
</li>
</ul>
Esto es similar a @Konrad ''ktoso'' Malawski pero un poco más fácil de recordar.
Probado con Angular 1.4