【问题标题】:How do I dynamically load and display html which contains routerLink directives in Angular 2?如何在 Angular 2 中动态加载和显示包含 routerLink 指令的 html?
【发布时间】:2017-12-10 12:33:14
【问题描述】:

我有一个 Angular 2 组件,它通过一些用户操作从数据库加载 html。 html 包含具有相对路径的锚标记。鉴于我不希望在用户单击链接时重新加载整个应用程序,我正在尝试使用 routerLink 指令;但是,由于此 html 是动态加载的,因此不会处理 routerLink。 html 将不包含任何其他角度指令。实现这一目标的最简单方法是什么?请参阅下面的示例。

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>';
   }
}

【问题讨论】:

  • 为什么你不能用指令 *ngIf 显式放置锚点,当调用事件点击时将锚点设置为 true
  • 问题是html是在运行时而不是设计时生成的,这意味着没有处理任何角度指令

标签: angular angular2-routing angular2-template angular2-directives


【解决方案1】:

我会保持简单。

如果可能,将链接替换为&lt;span&gt; 标签并使用 CSS 使它们看起来像链接。将它们重写为&lt;span data-link="/some-route"&gt;link&lt;/span&gt;

在您的模板中使用点击监听器:

<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)
      }
}

这应该足以让链接正常工作。

从技术上讲,您实际上不必将标签重写为&lt;span&gt;&lt;a routerLink=""&gt; 也可以工作,因为它没有 href 属性来触发浏览器 URL 更改。只需阅读 routerLink 属性而不是我的示例。

【讨论】:

  • data- 属性被 innerHTML 指令剥离。我不得不添加一个管道来绕过这个。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2018-09-02
  • 2017-08-16
  • 1970-01-01
相关资源
最近更新 更多