使用 [innerHtml] 显示 html 时,bypassSecurityTrustHtml 禁用锚标记

Gan*_*esh 5 angular angular-dom-sanitizer

我正在使用 Angular 10。我有一个场景来获取 html 字符串(富文本编辑器返回的值)并将其显示在我的应用程序中(使用innerHtml)。我将获得各种样式,例如背景颜色、字体颜色、突出显示文本、超链接等。

我正在bypassSecurityTrustHtml通过管道使用(代码如下),以便<styles>考虑标签。

// sanitizeHtml.pipe.ts

@Pipe({ name: 'keepHtml', pure: false })
export class SanitizeHtmlPipe implements PipeTransform {
  constructor(private sanitizer: DomSanitizer) {
  }

  transform(content) {
    return this.sanitizer.bypassSecurityTrustHtml(content);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我获得超链接文本时<a href="http://www.someurl.com> click here </a>,这些锚链接不起作用。因此,当我单击该链接时,它不会打开href链接。

我见过像使用bypassSecurityTrustResourceUrl. 但我不能使用它,因为我无法单独从 html 内容中解析 url。

我还尝试使用其他 SO 问题中建议的如下功能,但它也没有帮助..

[innerHtml]="myHtmlContent | keepHtml | keepUrl"

[innerHtml]="myHtmlContent | keepUrl | keepHtml" // tried to reorder the pipe still didn't work

有没有办法在使用bypassSecurityTrustHtml 函数时使锚标记的href 链接正常工作?

谢谢你的时间。

Gan*_*esh 7

经过一些调试后,我发现我们不需要单独清理 html 字符串中的 url。

如果您使用管道并且bypassSecurityTrustHtml它不能与锚标记链接正常工作,那么您可能会犯与我相同的错误。


解决方案

只需pure: false从 中删除@Pipe({ name: 'keepHtml', pure: false })。通过这样做,您的管道将成为纯管道(pure: true默认值)

仅当检测到传递给管道的值或参数发生变化时,才会执行纯管道,而每个变化检测周期都会调用不纯管道。