如何在 Angular 2 中动态加载和显示包含 routerLink 指令的 html?
How do I dynamically load and display html which contains routerLink directives in Angular 2?
我有一个 Angular 2 组件,根据某些用户操作,它会从数据库加载 html。 html 包含具有相对路径的锚标记。鉴于我不希望在用户单击 link 时重新加载整个应用程序,我正在尝试使用 routerLink 指令;但是,由于此 html 是动态加载的,因此不会处理 routerLink。 html 将不包含任何其他 angular 指令。实现这一目标的最简单方法是什么?请参阅下面的示例。
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `<h1>Hello {{name}}</h1>
<p><a (click)="GetTextFromDatabase()">Get data from database</a> which should contain a <a routerLink="/some-route">working link</a></p>
<div [innerHTML]="data"></div>
<router-outlet></router-outlet>`,
})
export class AppComponent {
name: string = 'Angular';
data: string;
private GetTextFromDatabase(): void {
this.data = '<p>here is my paragraph containing a <a routerLink="/some-route">link</a>';
}
}
我会保持简单。
如果可能,用 <span>
标签替换链接并使用 CSS 使它们看起来像链接。将它们重写为 <span data-link="/some-route">link</span>
.
在您的模板中使用点击侦听器:
<div [innerHTML]="data" (click)="onDataClick($event)"></div>
在您的组件中读取点击目标:
public onDataClick(event: Event) {
if(event.target.tagName.toLowerCase() === 'span') {
const link = event.target.getAttribute('link');
// call the router to navigate to the new route
console.log(link)
}
}
这应该足以使链接正常工作。
从技术上讲,您实际上不必将标签重写为 <span>
。 <a routerLink="">
也可以工作,因为它没有 href
属性来触发浏览器 URL 更改。只需阅读 routerLink
属性而不是我的示例。
我有一个 Angular 2 组件,根据某些用户操作,它会从数据库加载 html。 html 包含具有相对路径的锚标记。鉴于我不希望在用户单击 link 时重新加载整个应用程序,我正在尝试使用 routerLink 指令;但是,由于此 html 是动态加载的,因此不会处理 routerLink。 html 将不包含任何其他 angular 指令。实现这一目标的最简单方法是什么?请参阅下面的示例。
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `<h1>Hello {{name}}</h1>
<p><a (click)="GetTextFromDatabase()">Get data from database</a> which should contain a <a routerLink="/some-route">working link</a></p>
<div [innerHTML]="data"></div>
<router-outlet></router-outlet>`,
})
export class AppComponent {
name: string = 'Angular';
data: string;
private GetTextFromDatabase(): void {
this.data = '<p>here is my paragraph containing a <a routerLink="/some-route">link</a>';
}
}
我会保持简单。
如果可能,用 <span>
标签替换链接并使用 CSS 使它们看起来像链接。将它们重写为 <span data-link="/some-route">link</span>
.
在您的模板中使用点击侦听器:
<div [innerHTML]="data" (click)="onDataClick($event)"></div>
在您的组件中读取点击目标:
public onDataClick(event: Event) {
if(event.target.tagName.toLowerCase() === 'span') {
const link = event.target.getAttribute('link');
// call the router to navigate to the new route
console.log(link)
}
}
这应该足以使链接正常工作。
从技术上讲,您实际上不必将标签重写为 <span>
。 <a routerLink="">
也可以工作,因为它没有 href
属性来触发浏览器 URL 更改。只需阅读 routerLink
属性而不是我的示例。