for example array javascript angularjs angularjs-ng-repeat angularjs-ng-show

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>


Puedes usar ngShow .

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

Ver example

O puedes usar ngHide

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

Ver example

Por objeto puedes probar Object.keys .


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