1

我有一个 canActivate (guard),我正在检查加载的变量以查看队列是否已加载。

但是,我现在需要检查多个队列加载变量( boolean )以查看它们是否已全部加载。然后我将需要调度操作。

canActivate(): Observable < boolean > {
  return this.checkStore().pipe(
    switchMap(() => of(true)),
    catchError(() => of(false))
  );
}

checkStore(): Observable < boolean > {
  //   Below are the additional booleans I need to check on
  //  this.store.select(fromStore.isFirstQueueLoaded);
  //  this.store.select(fromStore.isSecondQueueLoaded);
  //  this.store.select(fromStore.isThirdQueueLoaded);
  //  this.store.select(fromStore.isFourthQueueLoaded);
  //  this.store.select(fromStore.isFifthQueueLoaded);
  //  this.store.select(fromStore.isSixthQueueLoaded);
  //  this.store.select(fromStore.isSeventhQueueLoaded);


  return this.store.select(fromStore.isFirstQueueLoaded)
    // want to check for remaining queues loaded boolean val here
    .pipe(
      tap(loaded => {
        // need to check for loaded values of all queues
        if (!loaded) {
          this.dispatchActiontoStoreForAllQueue();
        }
      }),
      filter(loaded => loaded)
    );
}

dispatchActiontoStoreForAllQueue(): void {
  this.store.dispatch(new fromStore.LoadFirstQueue({}));
  this.store.dispatch(new fromStore.LoadSecondQueue({}));
  this.store.dispatch(new fromStore.LoadthirdQueue({}));
  this.store.dispatch(new fromStore.LoadFourthQueue({}));
  this.store.dispatch(new fromStore.LoadFifthQueue({}));
  this.store.dispatch(new fromStore.LoadSixthQueue({}));
  this.store.dispatch(new fromStore.LoadSeventhQueue({}));
}

我们如何结合所有这些 NGRX 选择(优化方法)来检查它们的布尔值并激活守卫?

4

1 回答 1

1

我会创建一个选择器而不是七个不同的选择器。这看起来像:

export const fromStore = {
  areAllQueuesLoaded: createSelector(selectAppState, (state: AppState) => {
    return state.queue1.isLoaded &&
           state.queue2.isLoaded &&
           state.queue3.isLoaded &&
           state.queue4.isLoaded &&
           state.queue5.isLoaded &&
           state.queue6.isLoaded &&
           state.queue7.isLoaded;
  }),
}

然后在您的组件中,您只需要一个选择:

return this.store.select(fromStore.areAllQueuesLoaded).subscribe(loaded => {   
    this.dispatchActiontoStoreForAllQueue();
});
于 2018-06-28T19:42:32.933 回答