public lotId$ = new Subject<number>();
@Input() public set lotId(value: number) {
this.lotId$.next(value);
};
public results$ = this.lotId$.asObservable().pipe(
skipWhile(lotId => !lotId),
switchMap(lotId => this.logicService.getMappedTakeOffTasksForLot(lotId)),
tap(console.log)
);
在上面的代碼中,results$不是每次發出都lotId$發出。有誰知道為什么?代碼在results$創建組件時運行一次,然后再也不運行。
編輯:源發出 58。
編輯:當我從改變作業Subject來BehaviorSubject。為什么?我希望我早點嘗試。
uj5u.com熱心網友回復:
results$ 不會在每次 lotId$ 發出時發出。
results$在lotId$發出之前發生的訂閱將接收這些值。換句話說,遲到的訂閱者不會收到先前的值(“遲到的訂閱者”是指在某些排放發生后訂閱)。
假設您async在模板中使用管道,則results$在視圖初始化之后才會進行訂閱,但在此之前會呼叫 @Input() 設定器。
你會發現如果你在建構式中訂閱(只是為了實驗),派生results$的實際上會發出初始值。
所以,應該清楚為什么改變為
如果一個組件有一個 optional @Input(),我會使用它,BehaviorSubject因為需要一個默認值。如果需要輸入,我使用ReplaySubject(1),所以除非消費者提供輸入,否則我的邏輯不會執行。
這是一個小小的StackBlitz,您可以在其中查看 Angular 生命周期掛鉤的順序以及訂閱發生的時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387506.html
