Чтение по подписке
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user-detail',
templateUrl: 'user-detail.component.html'
})
export class UserDetailComponent implements OnInit {
constructor(private activeRoute: ActivatedRoute) {
}
ngOnInit() {
this.activeRoute.queryParams.subscribe(queryParams => {
// do something with the query params
});
this.activeRoute.params.subscribe(routeParams => {
this.loadUserDetail(routeParams.id);
});
}
Грязный путь
Вложив подписчиков, как показано ниже:
ngOnInit() {
// Nest them together and
this.activeRoute.queryParams.subscribe(queryParams => {
this.activeRoute.params.subscribe(routeParams => {
this.loadUserDetail(routeParams.id, queryParams.type);
});
});
}
Или у вас может возникнуть желание написать разнообразную версию этого, то есть переместить эти вложенные обратные вызовы в вспомогательную функцию, а затем передать ей еще один обратный вызов, принимающий параметры запроса и маршрута, например
ngOnInit() {
this.readUrlParams((routeParams, queryParams) => {
this.loadUserDetail(routeParams.id, queryParams.type);
});
}
readUrlParams(callback) {
// Nest them together and
this.activeRoute.queryParams.subscribe(queryParams => {
this.activeRoute.params.subscribe(routeParams => {
callback(routeParams, queryParams);
});
});
}
Использовать RxJS
RxJS - действительно мощная библиотека, и вы можете сделать это несколькими различными способами, но один из них, который мне нравится и который я использую чаще всего, - это использование оператора combLatest, с помощью которого мы объединяем маршрут и запроспараметры и имеют одну наблюдаемую, давая нам обоим в одном объекте.Вот как будет выглядеть наш обновленный пример
import { ActivatedRoute } from '@angular/router';
// Add the observable and combineLatest
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/combineLatest';
@Component({
selector: 'app-user-detail',
templateUrl: 'user-detail.component.html'
})
export class UserDetailComponent implements OnInit {
constructor(private activeRoute: ActivatedRoute) {
}
ngOnInit() {
// Combine them both into a single observable
const urlParams = Observable.combineLatest(
this.activatedRoute.params,
this.activatedRoute.queryParams,
(params, queryParams) => ({ ...params, ...queryParams})
);
// Subscribe to the single observable, giving us both
urlParams.subscribe(routeParams => {
// routeParams containing both the query and route params
this.loadUserDetail(routeParams.id, routeParams.type);
});
}
}