#angular #ngrx #angular-router #ngrx-router-store
#angular #ngrx #angular-router #ngrx-router-store
Вопрос:
Сценарий:
У меня есть одна home
страница с двумя компонентами. У каждого компонента есть свои собственные параметры запроса. например, у XComponent есть параметры запроса: from
и to
, а у YComponent есть параметры запроса: id
и type
.
Навигация по Xcomponent выглядит следующим образом:
onFilter(filter) {
let navExtras: NavigationExtras = {
queryParams: {
from:'POD',
to: `P${filter}D`
},
relativeTo: this.route,
queryParamsHandling: 'merge',
}
this.router.navigate(['home'], navExtras)
}
Навигация по YComponent выглядит следующим образом:
onFilter(filter) {
let navExtras: NavigationExtras = {
queryParams: {
id: 1,
type: 5
},
relativeTo: this.route,
queryParamsHandling: 'merge',
}
this.router.navigate(['home'], navExtras)
}
Главный экран должен отображаться в соответствии с этими двумя компонентами.
Оба компонента X и Y имеют собственные действия, редуктор и эффект.
XEffect:
@Effect()
fromRoute$: Observable<Action> = this.actions$
.pipe(
ofType<RouterNavigationAction>(ROUTER_NAVIGATION),
map((action: RouterNavigationAction) => action.payload.routerState['queryParams']),
switchMap((queryparams: any) => {
return this.XService.getX(queryparams)
.pipe(
map((data: any) => new treeActions.UpdateXSuccessAction({sports: data})),
catchError(err => of(new treeActions.UpdateXFailureAction(err)))
)
})
)
Эффект:
@Effect()
fromRoute$: Observable<Action> = this.actions$
.pipe(
ofType<RouterNavigationAction>(ROUTER_NAVIGATION),
map((action: RouterNavigationAction) => action.payload.routerState['queryParams']),
switchMap((queryparams: any) => {
return this.YService.getY(queryparams)
.pipe(
map((data: any) => new treeActions.UpdateYSuccessAction({sports: data})),
catchError(err => of(new treeActions.UpdateYFailureAction(err)))
)
})
)
Например. если пользователь изменит from
to
параметры X компонента, ROUTER_NAVIGATION
действие запускается, и оба XEffect
и YEffect
перехватывают это действие, и нет необходимости обновлять данные, связанные с компонентом, которые он все еще обновляет.
Мои цели заключаются в том, что при изменении параметров запроса X-компонента следует обновить данные, связанные с X-компонентом. И когда параметры запроса, связанные с компонентом Y, изменятся, должны быть обновлены только данные, связанные с компонентом Y.
PS Я не могу понять, какой вариант является лучшим для заголовка. Если у вас будут какие-либо предложения, я обновлю.
Ответ №1:
Из того, что я вижу, у вас есть два варианта:
- Используйте защиту маршрутизатора
- Используйте оператор фильтра RxJS
Комментарии:
1. stackblitz.com/edit/angular-v4h1vg Я создал пример без ngrx, но проблема в любом случае та же. У меня есть два отдельных компонента X и Y, я отслеживаю изменения параметров запроса в home.component. при каждом изменении параметра запроса выполняются запросы на BE, и я хочу определить, какой параметр запроса изменен.