Eu pensei que isso seria uma coisa muito comum, mas não consegui encontrar como lidar com isso no AngularJS. Digamos que eu tenho uma lista de eventos e quero produzi-los com o AngularJS, então isso é bem fácil:
<ul>
<li ng-repeat="event in events">{{event.title}}</li>
</ul>
Mas como eu manejo o caso quando a lista está vazia? Quero ter uma caixa de mensagem no lugar em que a lista esteja com algo como "Nenhum evento" ou similar. A única coisa que chegaria perto é ng-switch
com events.length
(como verifico se vazio quando um objeto e não uma matriz?), Mas essa é realmente a única opção que tenho?
Respostas:
Você pode usar o ngShow .
Veja exemplo .
Ou você pode usar o ngHide
Veja exemplo .
Para objeto, você pode testar Object.keys .
fonte
ng-hide="hasEvents()"
.E se você quiser usar isso com uma lista filtrada, aqui está um truque:
fonte
filteredItems
e definindo seu valor como(items | filter:keyword)
- em outras palavras, o array retornado pelo filtro"face in filteredFaces = faces|filter:{deleted: true} | orderBy:'text'
mas eu concordo com todos, esse é um truque fabuloso.Você pode querer verificar a diretiva angular-ui
ui-if
se quiser remover oul
do DOM quando a lista estiver vazia:fonte
ng-hide
sem angular-ui, mas ele apenas oculta o nó, não o remove da árvore DOM. Com aui-if
diretiva angular-ui , ele removerá o nó DOM. Portanto, você precisa pelo menos adicionar aui-if
diretiva do código angular-ui ao seu próprio código.ng-if
incluído!ng-if
está criando um novo escopo, ondeng-hide
não está. Isso pode causar comportamento inesperado.Com as versões mais recentes do angularjs, a resposta correta para esta pergunta é usar
ng-if
:Essa solução não piscará quando a lista estiver prestes a baixar porque a lista precisa ser definida e com um comprimento de 0 para que a mensagem seja exibida.
Aqui está um plunker para mostrá-lo em uso: http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p=preview
Dica: você também pode mostrar um texto ou botão giratório de carregamento:
fonte
Isso é semelhante ao @Konrad 'ktoso' Malawski, mas um pouco mais fácil de lembrar.
Testado com Angular 1.4
fonte
ng-if='!filteredItems.length'
item in items | filter: ... | filter: ...
<li ng-if="!filteredItems.length">
item in (filteredItems = (items | filter: someFilter))
Aqui está uma abordagem diferente usando CSS em vez de JavaScript / AngularJS.
CSS:
Marcação:
Se a lista estiver vazia, o <li ng-repeat = "item no filterItems"> etc. será comentado e se tornará um comentário em vez de um elemento li.
fonte
Você pode usar este ng-switch:
fonte
Você pode usar a
as
palavra-chave para referenciar uma coleção em umng-repeat
elemento:fonte
Eu costumo usar o ng-show
onde variável você define, por exemplo
fonte
você pode usar ng-if porque isso não é renderizado na página html e você não vê sua tag html na inspeção ...
fonte