首页 文章

使用CanActivate guard中的store.dispatch

提问于
浏览
0

在我的示例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
  }
}

以下是相关的reducer代码

....
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后卫应该返回布尔值的Observable,但无论是返回true还是false,只会在canActivateSuccess函数/ action中知道,在这种情况下我应该如何从canActivate guard返回一个值 .

1 回答

  • 2

    您可以与 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...);
    }
    

    Things to watch out for :对于此解决方案,您必须确保在 this.userService.canActivate() 运行时没有其他 CAN_ACTIVATE_SUCCESS -action发出 . 否则,这可能会意外触发警卫 .

相关问题