在角度我有抽象类,负责查询参数更改:
@Injectable()导出抽象类PageDetailsAbstract< T>实现OnInit { 对象:字符串; 身份证号码; …
你可以用一个 Subject ( http://reactivex.io/rxjs/class/es6/Subject.js~Subject.html )
Subject
我创建了一个非常简化的stackblitz来展示它是如何工作的 https://stackblitz.com/edit/angular-zyvkpu?file=src%2Fapp%2Fapp.component.ts
查看控制台输出以进行验证。
这是相关的代码部分(适用于您的情况,而不是来自stackblitz的1:1)
@Injectable() export abstract class PageDetailsAbstract<T> implements OnInit { object: string; id: number; details$: Subject<T> = new Subject<T>(); constructor( protected entitiesSelectors: EntitiesSelectors) { } ngOnInit() { this.route.params .pipe( map(resp => +resp.id), ) .subscribe(resp => { this.id = resp; this.adopt(); }); } protected adopt() { if (this.id) { this.entitiesSelectors.details(this.object, this.id).subscribe((detail: T) => { this.details$.next(detail); }); } }
我个人会重新调整一下代码。 这是一个更清洁的赌注,因为你不会嵌入多个来电 subscribe 并且你不依赖(至少没有那么多) this.id 它存在于rxjs流程之外。
subscribe
this.id
至
@Injectable() export abstract class PageDetailsAbstract<T> implements OnInit { object: string; id: number; details$: Subject<T> = new Subject<T>(); constructor( protected entitiesSelectors: EntitiesSelectors) { } ngOnInit() { this.route.params .pipe( mergeMap((resp: any) => { return this.adopt(+resp.id); })) .subscribe((detail: T) => { this.details$.next(detail); }); } protected adopt(id: number): Observable<T> { if (this.id) { return this.entitiesSelectors.details(this.object, this.id); } else { return of(null); // or whatever is appropriate in your case (e.g. EMPTY or something) } }
你的孩子班级会保持不变。
的 为什么 强> 至于为什么你的例子不起作用: 我想是因为 details$ 是一种冷漠的观察。 ( https://blog.thoughtram.io/angular/2016/06/16/cold-vs-hot-observables.html )
details$
当你重新分配 details$ 你创建一个新的observable,之前订阅的没有意义,因为它是另一个observable。您需要重新订阅。
Subject 是一个热门观察。 也许你也可以使用类似的东西 publish 要么 share 把你的冷观察变成一个热的观察者。
publish
share