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 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 acercaría es ng-switch
con events.length
(¿cómo verifico si está vacío cuando hay un objeto y no una matriz?), Pero ¿es realmente la única opción que tengo?
Respuestas:
Puedes usar ngShow .
Ver ejemplo .
O puedes usar ngHide
Ver ejemplo .
Para el objeto, puede probar Object.keys .
fuente
ng-hide="hasEvents()"
.Y si quieres usar esto con una lista filtrada, aquí hay un buen truco:
fuente
filteredItems
y configurando su valor para(items | filter:keyword)
, en otras palabras, la matriz devuelta por el filtro"face in filteredFaces = faces|filter:{deleted: true} | orderBy:'text'
pero estoy de acuerdo con todos, este es un truco fabuloso.Es posible que desee consultar la directiva angular-ui
ui-if
si solo desea eliminarul
el DOM cuando la lista está vacía:fuente
ng-hide
sin angular-ui, pero solo ocultará el nodo, no lo eliminará del árbol DOM. Con laui-if
directiva angular-ui , eliminará el nodo DOM. Por lo tanto, debe agregar al menos laui-if
directiva del código angular-ui a su propio código.ng-if
incluido!ng-if
está creando un nuevo ámbito, dondeng-hide
no lo está. Esto puede causar un comportamiento inesperado.Con las versiones más recientes de angularjs, la respuesta correcta a esta pregunta es usar
ng-if
:Esta solución no parpadeará cuando la lista esté a punto de descargarse porque la lista tiene que 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
Sugerencia: También puede mostrar un texto de carga o una flecha giratoria:
fuente
Esto es similar a @Konrad 'ktoso' Malawski pero un poco más fácil de recordar.
Probado con Angular 1.4
fuente
ng-if='!filteredItems.length'
item in items | filter: ... | filter: ...
<li ng-if="!filteredItems.length">
item in (filteredItems = (items | filter: someFilter))
Aquí hay un enfoque diferente usando CSS en lugar de JavaScript / AngularJS.
CSS:
Margen:
Si la lista está vacía, <li ng-repeat = "item in filterItems">, etc. se comentará y se convertirá en un comentario en lugar de un elemento li.
fuente
Puedes usar este ng-switch:
fuente
Puede usar la
as
palabra clave para referir una colección bajo unng-repeat
elemento:fuente
yo suelo usar ng-show
donde variable define por ejemplo
fuente
puede usar ng-if porque esto no se procesa en la página html y no ve su etiqueta html en la inspección ...
fuente