【问题标题】:Angular - How to access and replace innerHTML from a directiveAngular - 如何从指令访问和替换in​​nerHTML
【发布时间】:2018-01-25 20:21:51
【问题描述】:

我正在尝试创建一个指令,通过添加指向以 @ 符号开头的子字符串的链接来修改元素的 innerHTML

这是我迄今为止尝试过的,

linkify.directive.ts

  constructor(private elementRef: ElementRef, private renderer: Renderer2) { 
      let elementText = this.elementRef.nativeElement.innerHTML;
      // elementText = '@user mentioned you';
      console.log(`Element Text: ${elementText}`);
      this.renderer.setProperty(this.elementRef.nativeElement, 'innerHTML', this.stylize(elementText));
  }

我就是这样用的

<p linkify> Hey @user check this out! </p>

在调试时我做了以下观察,

  • this.elementRef.nativeElement.innerHTML 总是有一个空字符串。
  • this.renderer.setProperty(this.elementRef.nativeElement, 'innerHTML', 'something'); 追加 something 到元素文本的开头,而不是替换。

问题一:如何访问元素的innerHTML

问题2:如何通过指令设置元素的innerHTML?

Stackblitz demonstrating the problem

我尝试了Renderer2 的文档,但对我没有帮助。

【问题讨论】:

  • 改为管道并使用 dom sanitizer

标签: angular angular-directive


【解决方案1】:

正如@bryan60 建议的那样,理想的方法是创建管道而不是指令。

这是我最终创建的管道,

linkify.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({
  name: 'linkify'
})
export class LinkifyPipe implements PipeTransform {

  constructor(private _domSanitizer: DomSanitizer) {}

  transform(value: any, args?: any): any {
    return this._domSanitizer.bypassSecurityTrustHtml(this.stylize(value));
  }

  private stylize(text: string): string {
    let stylizedText: string = '';
    if (text && text.length > 0) {
      for (let t of text.split(" ")) {
        if (t.startsWith("@") && t.length>1)
          stylizedText += `<a href="#${t.substring(1)}">${t}</a> `;
        else
          stylizedText += t + " ";
      }
      return stylizedText;
    }
    else return text;
  }

}

用法:

<p [innerHTML]="sample | linkify"></p>

Demo Stackblitz

【讨论】:

  • 很高兴它成功了。我很惊讶您需要使用 dom sanitizer 直接访问内部 HTML。我以为

    {{ 文字 | linkify }}

    会正常工作。我不得不做一些非常接近这个的事情,这就是我最终得到的语法。不记得是怎么回事。
  • @bryan60 我最初只是尝试使用它,但遇到了this 问题,结果表明使用 DomSanitizer 清理的字符串应该绑定到 innerHTML,否则它们最终会呈现清理后的标记作为纯文本。
猜你喜欢
  • 2019-02-21
  • 2021-03-10
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多