Вы хотите делать запросы API на основе параметра маршрута. Это просто случай цепочки вызова API к наблюдаемому маршруту.
route.queryParams
- это Subject
, который выдает новое значение при изменении параметров запроса. И поскольку он реализован с BehaviorSubject
, это означает, что вы также получаете начальное значение.
Все, что зависит от параметров запроса, должно быть приковано к queryParams
, наблюдаемому с switchMap
.
export class NavComponent implements OnInit {
//iterables for holding data
menus;
content;
constructor(private data: DataService, private route: ActivatedRoute) { }
ngOnInit(){
this.data.getMenus().subscribe((data: {}) => this.menus = data);
this.route.queryParams.pipe(
switchMap(params => this.data.getContent(params.id))
).subscribe((response: {}) => {
this.content = response;
});
}
}
И поскольку ваш компонент теперь заботится о вызове службы при изменении параметров запроса, вам не нужно вызывать его из HTML.
<div *ngFor="let menu of menus; index as id">
<ul>
<li>
<a routerLink = "" [queryParams]="{id: id}">
{{menu['lessonName']}}
</a>
</li>
</ul>
</div>
<div *ngIf="content">
{{content.id}}
</div>
Так что теперь поток событий:
- 1a. Загрузить меню
- 1b. Загрузка содержимого на основе начального параметра запроса
- Пользователь нажимает на ссылку меню
- Обновлены параметры запроса
- Ваш
switchMap
выполняет новый сервисный вызов с последним параметром запроса
1a и 1b не синхронизированы, но они, кажется, независимы друг от друга, поэтому сейчас это не проблема.
Обычно вы должны были бы отказаться от подписки на темы, но маршрутизатор - это особый случай, который убирает после себя, поэтому вам не нужно отписываться вручную.