Подождите, пока ресурс загрузится в guard, используя ngrx и селекторы - PullRequest
0 голосов
/ 01 апреля 2020

TLDR: у меня есть селектор isLoading, я хочу использовать его в своей охране, чтобы активировать маршрут, только когда этот селектор имеет значение false.

Вот редуктор:


export const initialState: State = {
  loaded: false,
  loading: false,
  success: {
    [...]
  }
};


export const reducer = createReducer(
  initialState,

  on(
    fromApiActions.loadRequest,
    (state): State => ({
      ...state,
      loading: true
    })
  ),

  on(
    fromApiActions.loadRequestSuccess
    (state, partialState): State => ({
      ...state,
      loaded: true,
      loading: false,
      success: {
        ...state.success,
        ...partialState
      }
    })
  ),

  on(
    fromApiActions.loadRequestFail,
    (state): State => ({
      ...state,
      loaded: false,
      loading: false
    })
  )
);


И у меня есть селектор, который выбирает loading из состояния. При загрузке приложения я отправляю действие LoadRequest, которое превращает loading в истинное значение.

Вот мой защитник:

export class CanActivateChildrenGuard implements CanActivateChild {
  constructor(private store: Store<fromDataUserInformations.State>) {}

  canActivateChild(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {

    return this.store.pipe(
      select(fromDataUserInformations.isLoading),
      // what to use here?
    );

  }

}

Мне не удается заставить стражника ждать для выполнения LoadRequestSuccess (что в эффекте LoadRequest), чтобы повернуть loading в false, чтобы я мог вернуть что-то вроде !loading Я думаю.

Спасибо!

1 Ответ

2 голосов
/ 01 апреля 2020
return this.store.pipe(
      select(fromDataUserInformations.isLoading),
      skipWhile(flag => !flag),
      skipWhile(flag => flag),
      mapTo(true),
    );

ожидает, пока fromDataUserInformations.isLoading станет истинным, затем ждет, пока fromDataUserInformations.isLoading снова станет ложным, затем сбросит охрану с true (средство разрешает навигацию).

...