Angular 2是BehaviorSubjects处理可更改项目的正确方法吗?

时间:2018-02-19 18:31:34

标签: angular angular2-services

我在Angular-Services中使用BehaviourSubjects来处理同时使用多个组件的项目。

但如果我有可更改的项目(例如我的高级英雄游览应用程序中的Herosets),这个概念并没有按预期工作。

My-Heroset-App:https://stackblitz.com/edit/angular-p3gouf

如果用户打开一个Set,则Overview-Page将特定项目设置为Subject。如果用户打开另一个集合,他可以看到旧集合,直到解决了新集合。

我解决了这个问题,但它看起来像是一种解决方法。

ngOnDestroy() { this.setHeroes(null); this.subscription.unsubscribe(); }

解析器也会解决这个问题,但我认为这对我来说不是一个好方法。

有没有更好的方法来解决这个问题?还有另一个概念吗?

感谢

弗兰克

1 个答案:

答案 0 :(得分:0)

是的,BehaviorSubjects对此不利(仅适用于非常罕见的情况)。在这种情况下,您可以简单地用Observable.of(数据)替换它,就像在现实世界的应用程序中一样,您可能会将API中的数据作为可观察数据。

编辑:一些代码。对不起,我在平板电脑上,所以stackblitz不能正常工作,编写代码有点痛苦。希望你能从中得到这个想法:)

服务:

private heroSets = [ [{id:1}], [{id:2}] ]; 
getHeroSet (index:number):Observable<Hero> { 
   return Observable.of(this.heroSets[index]); 
   // Simulated api call. In real world, 
   // usually return a call to HttpClient ie. this.http.get(...),
   // and you won't need to change any other code.
}

组件:

heros$:Observable<Hero>;
chooseHeroSet(index:number) { 
   this.heros$ = this.service.getHeroSet(index);
}

TPL:

<div *ngFor="let hero of (heros$ | async)">{{hero.id}}</div>