Лучшая практика получения параметров и queryParams в Angular 2
Я пытаюсь понять способ создания маршрута, с информацией в Параметры URL.
это мой маршрут (приложение.маршруты.ts):
{path: 'results/:id', component: MyResultsComponent},
вот как я ориентируюсь на маршрут:
goToResultsPage(query: string) {
this.router.navigate(['results', query], { queryParams: { pageSize: 20 } });}
как вы можете видеть, у меня также есть параметр запроса. Мне было интересно, какой лучший и самый чистый способ получить это в моем MyResultsComponent
. Сейчас я вроде вложенного subscribe
структура:
ngOnInit() {
this.route
.params
.subscribe(params => {
this.query = params['id'];
this.route
.queryParams
.subscribe(queryParams => {
this.offset = queryParams['pageSize'];
#find entries this.entryService.findEntries(this.query, this.pageSize);
});
});
}
после этого я хочу передать это параметры в EntryService
, который возвращает записи.
4 ответов
Как насчет использования forkJoin?
ForkJoin позволяет вам присоединиться к двум наблюдаемым и ждать ответа от обоих. Вы можете посмотреть документацию здесь подробнее о здесь.
как в коде это будет выглядеть примерно так:
ngOnInit() {
Observable.forkJoin(this.route.params, this.route.queryParams).subscribe(bothParams => {
// bothParams is an array, on the first index we have the router.params
// on the second index we have the queryParams
this.query = bothParams[0].query;
this.pageSize = bothParams[0].pageSize;
this.entryService.findEntries(this.query, this.pageSize);
});
}
вам может потребоваться добавить импорт:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
Наблюдаемой.combineLatest-это решение в этой ситуации, не так ли?
Observable
.combineLatest(
this.route.params,
this.route.queryParams,
(params: any, queryParams: any) => {
return {
id: +params.id,
pageSize: queryParams.pageSize ? +queryParams.pageSize: null
}
})
.subscribe(bothParams => {
this.id = bothParams.id;
this.pageSize = bothParams.pageSize;
});
Я думаю, если вам нужно получить доступ к обоим одновременно, снимок является лучшим вариантом.
не проверено (только с верхней части головы)
ngOnInit() {
this.route
.params
.subscribe(params => {
this.query = params['id'];
this.offset = this.route.snapshot.queryParams['pageSize'];
# find entries this.entryService.findEntries(this.query, this.pageSize);
});
});
}
недавно я столкнулся с этой дилеммой, и лучшее решение, соответствующее моим потребностям, которое я нашел, - использовать Observable.merge
.
использование моментального снимка не очень хорошо, если вы хотите наблюдать изменения из параметров queryParams в том же компоненте (i.e поиск с помощью фильтров).
Observable.forkJoin
имеет ограничение, что оба наблюдаемых должны быть вызваны для работы, поэтому, если у вас есть сценарий, в котором могут быть изменения в params или в queryParams, но не обязательно в обоих, forkJoin не будет Нер вы.
Observable.merge
С другой стороны, срабатывает при срабатывании любого из них. Конечно, это также имеет некоторые недостатки, так как у вас могут быть два обратных вызова, вызываемых один за другим (в начале с params и queryParams).
вот пример:
Observable.merge(
this.route.params.map(params => this.handleParams(params)),
this.route.queryParams.map(queryParams => this.handleQueryParams(queryParams))
)
.subscribe(
() => this.onParamsOrQueryParamsChange()
);