2017-03-06 51 views
0

在我的示例Angular 2应用程序中,我使用ngrx/store来实现redux设计模式。从CanActivate后台使用store.dispatch

我已经实现CanActivate后卫在我的应用程序,下面是相关的代码

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后卫应该返回可观察布尔的,但是否返回true或false,将仅限于canActivateSuccess功能/动作是已知的,在这种情况下,我应该如何返回从canActivate后卫的值。

回答

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()在跑。否则这可能会意外触发警卫。