Конечно, есть простой способ. Просто создайте прокси эффектов для обработки действий маршрутизации и используйте роутер, как и любые другие NGRX-эффекты:
@Injectable()
export class RouterEffects {
@Effect({ dispatch: false })
navigate$ = this.actions$.ofType(RouterActions.GO)
.map((action: RouterActions.Go) => action.payload)
.do((routerPayload: RouterPayload) => {
this.router.navigate(routerPayload.path, routerPayload.query);
});
@Effect({ dispatch: false })
navigateBack$ = this.actions$.ofType(RouterActions.BACK)
.do(() => this.location.back());
@Effect({ dispatch: false })
navigateForward$ = this.actions$.ofType(RouterActions.FORWARD)
.do(() => this.location.forward());
constructor(
private actions$: Actions,
private router: Router,
private location: Location
) {}
}
с router.actions.ts:
export const GO = '[Router] Go';
export const BACK = '[Router] Back';
export const FORWARD = '[Router] Forward';
export interface RouterPayload {
path: string[];
query?: NavigationExtras;
}
export class Go implements Action {
readonly type = GO;
constructor(public payload: RouterPayload) {}
}
export class Back implements Action {
readonly type = BACK;
}
export class Forward implements Action {
readonly type = FORWARD;
}
export type Actions
= Go
| Back
| Forward;
и в вашем компоненте вы отправляете действия маршрутизатора при навигации вместо вызова routerLink непосредственно в шаблоне:
navigate(routerPayload: RouterPayload) {
this.store.dispatch(new RouterActions.Go(routerPayload));
}
Таким образом, вы также можете легко перемещаться по маршрутам туда-сюда.