Как вы обнаружили, вы не можете иметь динамический c шаблон в Angular, потому что шаблоны связаны с компонентами как javascript. Если вы хотите узнать больше, проверьте эту проблему на github . В результате этого: динамические c шаблоны могут нарушить компиляцию AOT.
Вы также обнаружили, что для innerHTML
объекта можно установить произвольное значение HTML, но routerLink
не будет работать в этом контексте. Почему? Поскольку routerlink
является директивой Angular, а не атрибутом HTML. Поскольку мы просто устанавливаем innerHTML
, это не скомпилированный шаблон.
Итак, каково решение? Давайте вернемся назад и подумаем о том, что делает routerLink
. Как оказалось, не так много. Взгляните на источник . В частности, это то, что он делает, когда щелкает элемент с директивой routerLink
:
@HostListener('click')
onClick(): boolean {
const extras = {
skipLocationChange: attrBoolValue(this.skipLocationChange),
replaceUrl: attrBoolValue(this.replaceUrl),
};
this.router.navigateByUrl(this.urlTree, extras);
return true;
}
Он просто использует HostListener
для отслеживания кликов и соответствующей маршрутизации. Мы можем сделать что-то подобное в нашем компоненте. Я назвал это FooterComponent
, так как вы упомянули, что это был нижний колонтитул с Dynami c HTML:
import { Component, Input, HostListener } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-footer',
template: '<div [innerHTML]="footerHtml"></div>'
})
export class FooterComponent {
@Input() footerHtml: string = "";
constructor(private router: Router) { }
// Watch for clicks in our component
@HostListener("click", ['$event'])
onClick(event: MouseEvent) {
// If we don't have an anchor tag, we don't need to do anything.
if (event.target instanceof HTMLAnchorElement === false) {
return;
}
// Prevent page from reloading
event.preventDefault();
let target = <HTMLAnchorElement>event.target;
// Navigate to the path in the link
this.router.navigate([target.pathname]);
}
}
Как вы можете видеть, он требует ввода, называемого footerHtml
, который типа строки. Чтобы использовать его, мы добавим его куда-нибудь:
<app-footer [footerHtml]="footerHtml"></app-footer>
Где свойство footerHtml
в нашем компоненте определяется следующим образом:
footerHtml = '<p>This is the footer with a <a href="/admin">link!</a></p>';
Когда элемент нажимается, мы проверяем чтобы убедиться, что пользователь нажал на гиперссылку. Если они это сделали, мы перемещаемся с помощью маршрутизатора и предотвращаем поведение по умолчанию. Вот рабочий пример StackBlitz . Надеюсь, это поможет!