Пока никто не публикует лучшее решение, вот мое:
Я определил RouterHelperService
, что несколько упрощает этот процесс.Одна из проблем заключается в том, что если вы попытаетесь внедрить экземпляр ActivatedRoute
непосредственно в своем сервисе, вам не хватит параметров, поэтому вам нужно передать его из компонента в сервис.
import { Injectable } from '@angular/core';
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { filter, flatMap, map } from 'rxjs/operators';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class RouterHelperService {
constructor(private router: Router) {
}
onNavigationEndReadParamByKey(route: ActivatedRoute, key: string): Observable<string> {
return this.router.events.pipe(
filter(event => event instanceof NavigationEnd),
flatMap(() => {
return route.params.pipe(
filter(params => params[key]),
map(params => params[key])
);
})
);
}
}
Таким образом, в моем компоненте я могу назвать его одним вызовом и одной подпиской.
export class SomeComponent implements OnInit, OnDestroy {
private routeSub: Subscription;
someResource: Observable<SomeResourceType>;
constructor(private someService: SomeService,
private route: ActivatedRoute) {
this.routeSub = this.routerHelper.onNavigationEndReadParamByKey(this.route, 'id').subscribe((id) => {
this.someResource = this.someService.findById(+id); //+id to convert it from a string to a number
});
}
ngOnInit(): void {
}
ngOnDestroy(): void {
this.routeSub.unsubscribe();
}
}