Angulaire 4 asynchrone avec le chargement et l'affichage lorsqu'il est vide

J'ai Angulaire composant qui reçoit un service CatalogServiceinjecté:

export class CatalogListComponent implements OnInit {
  catalog$: Observable<MovieResponseItem[]>;
  constructor(private catalogService: CatalogService) {}
  ngOnInit() {
    this.catalog$ = this.catalogService.userCatalog;
  }
}

Ce service renvoie un Observable<MovieResponseItem[]> sur la propriété userCatalog:

@Injectable()
export class CatalogService {
  get userCatalog(): Observable<MovieResponseItem[]> {
    return this._userCatalogSubject.asObservable();
  }
}

La MovieResponseItemest juste une interface simple:

export interface MovieResponseItem {
  title: string;
}

Maintenant, je veux parcourir les éléments et d'afficher une animation de chargement pendant que le catalogue des requêtes au service de base de données (ce qui prend un certain temps) - les travaux de cette. C'est le modèle utilisé:

<div *ngIf="(catalog$ | async)?.length > 0; else loading">
   <ng-container *ngFor="let item of catalog$ | async">
     <div>{{item.title}}</div>
   <ng-container>
</div>
<ng-template #loading>loading animation...</ng-template>

De toute évidence, cela affiche le #chargement du modèle, tandis que l'asynchrone est en attente de données. Si l'observable renvoie des données, il effectue une itération sur les valeurs du catalogue.

Mais maintenant, je veux me séparer de cette dans ce comportement:

  • tandis que nous attendons de données, l'affichage de l'animation de chargement
  • si nous avons une réponse du service et de la liste retournée est vide, afficher un texte d'information (comme "votre catalogue est vide") et de ne pas parcourir (comme il n'y a pas de données)
  • si nous avons une réponse du service et de la liste retournée a des valeurs, de parcourir les éléments (comme dans l'état actuel)

Comment puis-je arriver à cela? De ce que j'ai lu sur des postes similaires personne n'a essayé de l'atteindre (ou je n'ai pas trouver).

Merci beaucoup!

Vous pouvez ajouter un autre <ng-container *ngIf="catalogService.userCatalog.length == 0"> <div>your catalogue response is empty</div> <ng-container> juste en dessous de votre ngFor conteneur.

OriginalL'auteur dArignac | 2017-09-26