我正在联系返回完整 .html 文件的后端,该文件必须显示在 Angular 组件中。当我得到文件时,它导航到锚点,这在 Angular7 中不起作用,因为它试图导航到 localhost:4200/#。我想允许用户使用锚点进行导航。
我一直在尝试在不使用任何包的情况下执行此操作,使用 InnerHtml、OuterHtml、ElementRef、ViewContainerRef 并在后端解析数据。我尝试用 href="javascript:; (click)="navigate(#id)" 和 routerLink 替换: href="#id" 和碎片。
问题是这个新注入的代码由于 DOM 清理而无法工作。
@ViewChild('dynamic', { read: ElementRef }) dynamic: ElementRef;
private loadHtmlData(data: string) {
// Only take body
data = data.split("<body")[1].split(">").slice(1).join(">").split("</body>")[0];
let pageRegex = /(href="#page-)/g;
data = data.replace(pageRegex, 'href="javascript:;" [routerLink]="[]" fragment="page-');
this.fullHtml = data;
this.dynamic.nativeElement.outerHTML = data;
this.htmlLoaded = true;
}
<!-- Direct Injection
<div [innerHTML]="fullHtml | sanitizeHtml"
*ngIf="htmlLoaded"></div>
-->
<div #dynamic>
</div>
期望是单击新格式的链接会将我带到那个锚点。
像这样修复它:
<div [innerHTML]="navigationHtml | sanitizeHtml: 'html'"
(click)="loadedHtmlClicked($event)"
*ngIf="htmlLoaded">
</div>
loadedHtmlClicked(event) {
if (event && event.target && event.target.attributes) {
let attributes: NamedNodeMap = event.target.attributes;
let fragment = attributes.getNamedItem('fragment');
if (fragment && this.fragment != fragment.value) {
this.router.navigate([], { fragment: fragment.value });
let element = document.getElementById(fragment.value);
if (element) {
// Allows for some padding above element
window.scrollTo({
top: element.offsetTop + 60,
behavior: "smooth"
});
}
}
}
}