Я добавляю еще один ответ для решения проблемы, упомянутой в комментарии к первому ответу. Проблема в том, что iframe
внутри компонента по-прежнему перезагружается, даже если компонент поддерживается в RouteReuseStrategy . Вероятно, это связано с тем, что Angular отсоединяет его от DOM страницы, а затем снова подключает его.
Одним из решений для обхода проблемы является сохранение компонента с iframe
всегда живым внутри основного компонента приложения и просто скрытие его при переходе на другую страницу. Затем покажите его снова, если вы перейдете к маршруту, на котором вы хотите его показать. Вы можете сделать это, используя События маршрутизатора .
Вот пример компонента приложения, который реализует этот обходной путь. Компонент gwt
является компонентом с iFrame.
Шаблон:
<h2><a routerLink="/main">Main</a></h2>
<h2><a routerLink="/gwt">Gwt</a></h2>
<gwt [hidden]="!gwtVisible"></gwt>
<router-outlet [hidden]="gwtVisible"></router-outlet>
код:
export class AppComponent {
gwtVisible = false;
constructor(router: Router) {
router.events.subscribe((routerEvent) => {
if (routerEvent instanceof NavigationEnd) {
this.gwtVisible = routerEvent.url === '/gwt';
}
});
}
}
Как видно из кода, компонент приложения скрывает основное содержимое при переходе к маршруту /gwt
и показывает компонент gwt
, в противном случае он скрывает его и обычно показывает другое содержимое из router-outlet
.
В маршрутах, которые я определил, он перемещается к пустому компоненту, чтобы иметь что-то для маршрута /gwt
.
const routes: Routes = [
{ path: '', redirectTo: 'main', pathMatch: 'full' },
{ path: 'main', component: MainComponent },
{ path: 'gwt', component: EmptyComponent }
];
Я также создал StackBlitz с рабочим образцом.