2017-09-26 50 views
3

我有一个角部件,其获取喷射的服务CatalogService角4异步与加载和显示当空

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

MovieResponseItem是:

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

该服务上属性userCatalog返回Observable<MovieResponseItem[]>只是一个简单的界面:

export interface MovieResponseItem { 
    title: string; 
} 

现在我想迭代项目并显示加载动画,而目录查询底层服务的数据(这需要一些时间) - 这是有效的。这是使用的模板:

<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> 

这明显显示了#async正在等待数据时的#loading模板。如果observable返回数据,它会遍历目录值。

但现在我想这个分成这种行为:如果我们从服务,并返回列表的响应

  • 而我们等待数据,显示加载动画
  • 是空的,显示出信息文本(如“你的目录是空的”)并且不迭代(因为没有数据)
  • 如果我们有来自服务的响应并且返回的列表具有值,则迭代项目(如当前状态)

我该如何实现这一目标?从我在相似的帖子上阅读的内容来看,没有人试图达到这个目的(或者我没有找到它)。

非常感谢!

+0

您可以在您的ngFor容器下方添加另一个

your catalogue response is empty
。 –

回答

3
<div *ngIf="catalog$ | async as catalog; else loading"> 
    <ng-container *ngIf="catalog.length; else noItems"> 
    <div *ngFor="let item of catalog">{{item.title}}</div> 
    <ng-container> 
    <ng-template #noItems>No Items!</ng-template> 
</div> 
<ng-template #loading>loading animation...</ng-template> 

应该做的伎俩。最好使用尽可能少的异步管道,只需将其声明为“as”作为您可以使用的模板变量。否则,流将在每个异步管道中执行一次,这是一种不好的做法,如果这是http支持的,则可以创建不需要的http调用。

+0

感谢您的回答!不幸的是,这永远不会显示加载模板,但总是等待Observable答案时的noItem。 – dArignac

+0

我会检查你的结束标签,这段代码的作品 – bryan60

+0

结构和范围需要像我奠定或它不会工作。加载需要位于ngIf上的异步之外,并且noItems需要位于异步范围内但在目录之外。全长范围 – bryan60

0

嗯.. https://github.com/angular/angular/issues/14479

就扔在另一ngIf - else条件。

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

产品目录$是一个可观察的列表,所以它永远不会有长度 – bryan60

+0

我的歉意,我现在编辑。 – Everett

+0

谢谢,正如在其他答案中看到的,我的'catalogue $'不是null(当前,将会调整它),因此从不显示这个动画。良好的关联问题! – dArignac