En mi componente Angular 2 tengo una matriz observable
list$: Observable<any[]>;
En mi plantilla tengo
<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>
Pero list $ .length no funciona en el caso de una matriz observable.
Actualizar:
Parece que (list $ | async) ?. length nos da la longitud, pero el siguiente código aún no 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>
¿Alguien puede orientarme sobre cómo verificar la longitud de la matriz observable?
angular
observable
angular2-template
angular2-services
Naveed Ahmed
fuente
fuente
Respuestas:
Puedes usar la
| async
tubería:Actualización - Versión angular 6:
Si está cargando un esqueleto css, puede usar esto. Si la matriz no tiene elementos, mostrará la plantilla css. Si hay datos, complete el
ngFor
.fuente
<div *ngIf="(list$ | async)?.length==0">No records found.</div>
(agregado?
)?
es obligatorio porquelist$
solo se establece después de que Angular2 intenta renderizar la vista por primera vez.?
impide que se evalúe el resto de la subexpresión hasta que la parte que queda a la izquierda se?
convierta en!= null
(Elvis u operador de navegación segura).async
tubería resuelve datos y, por lo tanto, mi próximaasync
tubería en el bucle no muestra nada. O tal vez*ngIf
crea un alcance adicional y, por lo tanto, no funciona. Difícil de decir. Pero mientras mi bucle está envuelto dentro, no muestra ningún dato. Si se evalúatrue
correctamente.Una solución para .ts-Files:
fuente
onDestroy
componentePara Angular 4+, prueba esto
fuente
Si bien esta respuesta es correcta
Tenga en cuenta que si está utilizando un cliente http para llamar al backend (en la mayoría de los casos lo hace), obtendrá llamadas duplicadas a su API si tiene más de una lista $ | async . Esto se debe a que cada | async pipe creará un nuevo suscriptor a su lista $ observable.
fuente
Esto es lo que funcionó para mí:
Obtengo mis datos de httpClient async.
Todas las otras opciones aquí no funcionaron para mí, lo cual fue decepcionante. Especialmente la tubería sexy (list $ | async).
Basa ..
fuente
Su enfoque aquí tiene otro problema importante: al aprovechar la tubería asíncrona una y otra vez en su plantilla, en realidad está iniciando tantas suscripciones al único Observable.
KAMRUL HASAN SHAHED tiene el enfoque correcto anterior: use la tubería asíncrona una vez y luego proporcione un alias para el resultado que puede aprovechar en los nodos secundarios.
fuente
También se puede acortar:
Simplemente use el signo de exclamación antes del paréntesis.
fuente
iónico 4
funcionó cuando quité el
$
letrerofuente