No meu componente Angular 2, tenho uma matriz observável
list$: Observable<any[]>;
No meu modelo eu tenho
<div *ngIf="list$.length==0">No records found.</div>
<div *ngIf="list$.length>0">
<ul>
<li *ngFor="let item of list$ | async">item.name</li>
</ul>
</div>
Mas list $ .length não funciona no caso de array Observable.
Atualizar:
Parece que (list $ | async) ?. length nos dá o comprimento, mas o código abaixo ainda não funciona:
<div>
Length: {{(list$ | async)?.length}}
<div *ngIf="(list$ | async)?.length>0">
<ul>
<li *ngFor="let item of (list$ | async)">
{{item.firstName}}
</li>
</ul>
</div>
</div>
Alguém pode orientar como faço para verificar o comprimento da matriz Observable.
angular
observable
angular2-template
angular2-services
Naveed Ahmed
fonte
fonte
Respostas:
Você pode usar o
| async
tubo:Atualização - Versão Angular 6:
Se você estiver carregando um esqueleto css, poderá usá-lo. Se a matriz não tiver itens, ela exibirá o modelo css. Se houver dados, preencha o
ngFor
.fonte
<div *ngIf="(list$ | async)?.length==0">No records found.</div>
(adicionado?
)?
é necessário porquelist$
só é definido depois que Angular2 tenta renderizar a visualização pela primeira vez.?
evita que o resto da subexpressão seja avaliado até que a parte à esquerda de?
se torne!= null
(Elvis ou operador de navegação segura).async
pipe resolve dados e, portanto, meu próximoasync
pipe no loop não exibe nada. Ou talvez*ngIf
crie um escopo adicional e, portanto, não esteja funcionando. Difícil dizer. Mas embora meu loop esteja dentro de if, ele não exibe nenhum dado. Se for avaliadotrue
corretamente.Uma solução para arquivos .ts:
fonte
onDestroy
componentePara Angular 4+, experimente isto
fonte
Embora esta resposta esteja correta
Lembre-se de que se estiver usando um cliente http para chamar backend (na maioria dos casos você faz), obterá chamadas duplicadas para sua API se tiver mais de uma lista $ | assíncrono . Isso ocorre porque cada | O pipe assíncrono criará um novo assinante para sua lista $ observable.
fonte
Isto é o que funcionou para mim -
Estou recebendo meus dados de httpClient async.
Todas as outras opções aqui não funcionaram para mim, o que foi decepcionante. Especialmente o cachimbo sexy (list $ | async).
Basa ..
fonte
Sua abordagem aqui tem outro grande problema: ao aproveitar o pipe assíncrono repetidamente em seu modelo, você está na verdade iniciando tantas assinaturas para o único Observable.
KAMRUL HASAN SHAHED tem a abordagem certa acima: use o pipe assíncrono uma vez e, em seguida, forneça um alias para o resultado que você pode aproveitar nos nós filhos.
fonte
Também pode ser reduzido:
Basta usar o ponto de exclamação antes do parêntese.
fonte
iônico 4
funcionou quando eu removi o
$
sinalfonte