Используйте store.dispatch из CanActivate guard

В моем примере приложения Angular 2 я использую ngrx / store для реализации шаблона проектирования redux.

Я внедрил CanActivate guard в свое приложение, и ниже приведен соответствующий код.

canActivate(route: ActivatedRouteSnapshot, router: RouterStateSnapshot): Observable<boolean> {

    this.store.dispatch(canActivate()); 
    // HOW TO RETURN value ??
}

И ниже соответствующие действия

export function canActivate(): Action {
$.blockUI();
return {
    type: UserActionTypes.CAN_ACTIVATE,
    payload:{}
  }
}

export function canActivateSuccess(canActivateResponse: any): Action {
$.unblockUI();
return {
    type: UserActionTypes.CAN_ACTIVATE_SUCCESS,
    payload: canActivateResponse.data
  }
}

И ниже соответствующий код редуктора

....
case UserActionTypes.CAN_ACTIVATE_SUCCESS:           
        return Object.assign({}, action.payload);
.....

и ниже соответствующий код эффектов

 @Effect() canActivate$ = this.actions$
        .ofType(UserActionTypes.CAN_ACTIVATE)
       .switchMap(
       (action) => this.userService.canActivate()
           .map(response => canActivateSuccess)
        );

Мой вопрос: canActivate guard должен возвращать Observable логического значения, но, возвращать ли true или false, будет известно только в функции / действии canActivateSuccess, в этом случае как мне вернуть значение из canActivate guard.


person refactor    schedule 06.03.2017    source источник


Ответы (1)


Вы можете вернуть $actions.ofType(..) вместе с take(1):

canActivate(route: ActivatedRouteSnapshot, router: RouterStateSnapshot): Observable<boolean> {
    this.store.dispatch(canActivate()); 
    return this.this.actions$
        .ofType(UserActionTypes.CAN_ACTIVATE_SUCCESS)
        .map(payloadToBoolean...);
}

На что следует обратить внимание. Для этого решения необходимо убедиться, что никакое другое CAN_ACTIVATE_SUCCESS-действие не излучается во время работы this.userService.canActivate(). В противном случае это может случайно вызвать срабатывание защиты.

person olsn    schedule 06.03.2017