[英]Using NGRX in Router Guard
我正在為我的一條路線使用 CanActivate 保護,以確保使用組件的必要數據初始化我的 NGRX 存儲。 我正在關注這篇文章中的示例( https://stackoverflow.com/a/48652379/1568482 )並以此為基礎進行構建。
outputGrp$ = this.store.pipe(select(selectOutputGroup));
inputGrp$ = this.store.pipe(select(selectInputGroup));
-----------------------------------------
return <Observable<boolean>>this.store.select(selectGroupsLoaded).pipe(
map(loaded => {
if(!loaded)
this.store.dispatch(loadMainCanvas());
return loaded;
}),
filter(loaded => !!loaded),
take(1),
withLatestFrom(this.outputGrp$), //Get Output Group ID
tap(([loaded, og]) => this.outputGroupId = <string>og?.id),
filter(loaded => !!loaded),
take(1),
map((data) => data[0]),
withLatestFrom(this.inputGrp$), //Get Input Group ID
tap(([loaded, ig]) => this.inputGroupId = <string>ig?.id),
filter(([loaded, ig]) => !!loaded),
take(1),
//THIS NEVER GETS EVALUATED AGAIN AFTER STORE IS UPDATED FROM CALL BELOW!!!
withLatestFrom(this.store.select(selectInputGroupProcessorsLoaded)), //See if Input Group Processors Loaded
map(([l1, loaded]) => {
if(!loaded)
this.store.dispatch(loadProcessorsForGroup({groupId: this.inputGroupId, groupType: 'input'}));
return loaded;
}),
filter(loaded =>!!loaded),
take(1),
// GET: ERROR Error: Uncaught (in promise): EmptyError: no elements in sequence
}
在我的商店中,我存儲了 boolean 值,用於我想測試的每件事,以查看數據是否已加載。 我在警衛中評估這些值,如果它們沒有加載,我會發送一個調用來檢索數據並更新存儲。
加載“主畫布”項目后,我會繼續並在此處檢索一些必要的數據以供將來調用(groupIds)。 該數據加載,我能夠使用必要的數據設置變量。
當我到達withLatestFrom(this.store.select(selectInputGroupProcessorsLoaded))
它評估為 FALSE 並落入map()
function。 在那里,商店調度調用以檢索數據並且商店成功更新,但是...... selectInputGroupProcessorsLoaded
似乎沒有改變,導致重新評估語句。
我還有幾個像這樣的部分,它們都以同樣的方式失敗。
因此,將withLatestFrom
切換為switchMap
解決了我的問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.