AngularJS ng-repeat maneja el caso de lista vacía

Resuelto Prinzhorn asked hace 12 años • 10 respuestas

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 generarlos con AngularJS, entonces 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 donde esté la lista con algo como "Sin eventos" o similar. Lo único que se acercaría es ng-switchcon events.length(¿cómo puedo comprobar si está vacío cuando es un objeto y no una matriz?), pero ¿es realmente esa la única opción que tengo?

Prinzhorn avatar Sep 09 '12 21:09 Prinzhorn
Aceptado

Puedes usar ngShow .

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

Ver ejemplo .

O puedes usar ngHide

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

Ver ejemplo .

Para el objeto, puedes probar Object.keys .

Artem Andreev avatar Sep 09 '2012 17:09 Artem Andreev

Y si quieres usar esto con una lista filtrada, aquí tienes un buen truco:

<ul>
    <li ng-repeat="item in filteredItems  = (items | filter:keyword)">
        ...
    </li>
</ul>
<div ng-hide="filteredItems.length">No items found</div>
Konrad 'ktoso' Malawski avatar Sep 03 '2013 13:09 Konrad 'ktoso' Malawski

Es posible que desees consultar la directiva angular-ui ui-if si solo deseas eliminar uldel DOM cuando la lista está vacía:

<ul ui-if="!!events.length">
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>
Mortimer avatar Dec 01 '2012 21:12 Mortimer

Con las versiones más nuevas 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 plunker para mostrarlo en uso: http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p=preview

Consejo: También puedes mostrar un texto de carga o un control giratorio:

  <li ng-if="!list">( Loading... )</li>
Pylinux avatar Jan 02 '2015 07:01 Pylinux