Use store.dispatch from 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应该返回可观察到的布尔值,但是在CanactivateSuccess函数/操作中才能返回True还是Fals,在这种情况下,我应该如何从Canactivate Guard中返回值。

您可以与take(1)结合返回$actions.ofType(..)

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

要注意的事情:对于此解决方案,您必须确保在this.userService.canActivate()运行时没有其他CAN_ACTIVATE_SUCCESS -Action发出。否则,这可能会意外触发警卫。

相关内容

  • 没有找到相关文章

最新更新