Я думаю, что важно упомянуть, что queryParamMap
является производным от queryParams
, который является BehaviorSubject
:
function createActivatedRoute(c: ActivatedRouteSnapshot) {
return new ActivatedRoute(
new BehaviorSubject(c.url), new BehaviorSubject(c.params), new BehaviorSubject(c.queryParams),
new BehaviorSubject(c.fragment), new BehaviorSubject(c.data), c.outlet, c.component, c);
}
Источник
А вот как получается queryParamMap
:
get queryParamMap(): ParamMap {
if (!this._queryParamMap) {
this._queryParamMap = convertToParamMap(this.queryParams);
}
return this._queryParamMap;
}
Источник
Под капотом, создан поток переходов . Таким образом, когда вы нажимаете кнопку, в этот поток будет вставлен новый переход , что означает, что новые маршруты должны быть активированы :
export const activateRoutes =
(rootContexts: ChildrenOutletContexts, routeReuseStrategy: RouteReuseStrategy,
forwardEvent: (evt: Event) => void): MonoTypeOperatorFunction<NavigationTransition> =>
map(t => {
new ActivateRoutes(
routeReuseStrategy, t.targetRouterState!, t.currentRouterState, forwardEvent)
.activate(rootContexts);
return t;
});
Источник
Это приведет к вызову advanceActivatedRoute
и в конечном итоге эта строка будет достигнута:
(<any>route.queryParams).next(nextSnapshot.queryParams);
Таким образом, это должно быть первое сообщение, зарегистрированное на консоли.
Следующее сообщение связано с NavigationEnd
событием :
(this.events as Subject<Event>)
.next(new NavigationEnd(
t.id, this.serializeUrl(t.extractedUrl), this.serializeUrl(this.currentUrlTree)));
Если вы хотите визуализировать это, вы можете открыть это StackBlitz , открыть инструменты разработчика и поставить несколько точек останова:
- router_link.ts: 265 - при нажатии на кнопку
- activ_routes.ts: 25 - при активации маршрута
- router.ts: 1062 -
NavigationEnd
событие - router_state.ts: 390 -
advanceActivatedRoute
тело ( в процессе активации маршрута) - app.component.ts