可观察通过3个单独的服务调用从CombineLatest返回时,异步未维护组件中的数据

问题描述

所以我相信我了解发生了什么...每次选择器被触发时,它都会更新从ngRx存储返回的整个状态,因此最初加载数据的FinData现在在FranchiseData加载时变得不确定。如何防止这种情况发生,并简单地正确返回所有数据?我正在进行3个单独的服务调用,并在CombineLatest中返回它们,以确定routeGuard是否可以激活。它们都返回数据,但是问题在于它们不维护数据。其中一个首先在ngOnChanges中返回并显示数据,但随后一个返回,原始的不再具有任何数据。任何帮助表示赞赏!

**parent.html**
<financial-data [finData]="financialData$ | async" [finFactors]="financialFactors$ | async" [franchiseData]="franchiseData$ | async"></financial-data>

**parent.component**

financialData$: Observable<financialData[]>;
financialFactors$: Observable<financialFactors[]>;
franchiseData$: Observable<franchiseData>
ngOnInit() {
  this.financialData$ = this.store.select(getFinancialData);
  this.financialFactors$ = this.store.select(getFinancialFactors);
  this.franchiseData$ = this.store.select(getFranchiseData);
}

**child.component**
@input() finData: FinancialData[];
@input() finFactors: FinancialFactors[];
@input() franchiseData: FranchiseData;

ngOnChanges(changes) {
   if(this.finData && this.franchiseData && this.finFactors) { <--- this usually comes back with finFactors as undefined so it never runs this.getFinancials() but it never re-runs
      this.getFinancials();
   }
}

getFromStoreOrAPI(): Observable<any> {
  return combineLatest([
  this.store.select(getFinancialFactors),this.store.select(getFinancialData),this.store.select(getFranchiseData)
]).pipe(
  map(([financialFactors,financialData,franchiseData]) => ({
    financialFactors,franchiseData
  }))
);
}

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | boolean {
    let tranId = this.router.getCurrentNavigation().extras.state.tranId;
    let modelId = this.outer.getCurrentNavigation().extras.state.modelId;

    this.store.dispatch(scorecardActions.loadFinancialData({tranId: tranId}));
    this.store.dispatch(scorecardActions.loadFranchiseData({tranId: tranId}));
    this.store.dispatch(scorecardActions.loadFinancialFactors({modelId: modelId}));

    return this.getFromStoreOrAPI()
    .pipe(
        mapTo(true),<--- Neither one of these ever gets hit,I believe because it returning an array??
        catchError(() => of(false))
     );
   }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)