У меня есть две угловые мини-приложения на той же странице. (Длинная история.) Одна из них - навигационное приложение, а одно - основное приложение. Я использую новейший Угловой маршрутизатор, основанный на angular/vladivostok.Angular2 router's navigateByUrl() не вызывает ngOnInit()
Похоже, что угловой маршрутизатор в одном приложении (например, nav) не отвечает на изменения URL, созданные другим приложением (например, основное приложение). Поэтому я создал класс RouterSynchronizer
, который я предоставляю обоим приложениям. Он прослушивает события NavigationEnd
обоих маршрутизаторов. Когда один маршрутизатор (назовем его «источником») имеет событие, он вызывает navigateByUrl
на другом маршрутизаторе (назовем его «подписчиком»).
Это работает отлично по большей части. Однако он не вызывает ngOnInit
на компонентах подписчика.
Я создал a Plunk, чтобы продемонстрировать это, основываясь на живом примере официального представителя Angular Routing & Navigation guide. Обратите внимание, что когда вы нажимаете ссылки «Кризисный центр» и «Герои» в главном приложении, ngOnInit
не вызывается на соответствующие дочерние компоненты в компоненте nav. Однако при нажатии этих ссылок в навигационном компоненте ngOnInit
вызывает эти дочерние компоненты, но не на дочерних компонентах основного приложения (что приводит к тому, что списки героев/кризисных центров пустые).
Любые идеи? Благодаря!
RouterSynchronizer
класс:
import { Inject } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
interface ISubscriber {
id: string;
router: Router;
}
export class RouterSynchronizer {
private subscribers: ISubscriber[] = [];
connect(id: string, router: Router): void {
this.subscribers.push({ id, router });
this.startPublishing(id, router);
}
private startPublishing(source: string, router: Router): void {
router.events.subscribe(route => {
if (route instanceof NavigationEnd) {
this.subscribers.forEach(subscriber => {
if (subscriber.id === source || subscriber.router.url === route.urlAfterRedirects) {
// Prevent infinite loops.
return;
}
subscriber.router.navigateByUrl(route.urlAfterRedirects);
});
}
});
}
}
Если метод, который испускает событие, испускается в другом Угловом экземпляре, тогда зона текущего экземпляр не знает об этом. Вам нужно использовать 'zone.run (() => {}) ', как вы это сделали, чтобы выполнить код в зоне текущего приложения Angular2. –