2017-03-06 12 views
0

私のサンプルのAngular 2アプリケーションでは、reduxデザインパターンを実装するためにngrx/storeを使用しています。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ガードは、ブールの観測返す必要がありますが、私はcanActivateガードから値を返す必要がありますどのような場合には、trueまたはfalseが、唯一canActivateSuccess機能/アクション内知られているであろう返すかどうか、です。

答えて

1

あなたは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...); 
} 

物事に注意する:あなたは確認する必要があります。このソリューションでは、他のCAN_ACTIVATE_SUCCESS -actionはthis.userService.canActivate()ながら放出しないことが走っています。そうしないと、誤ってガードが起動する可能性があります。

関連する問題