Angular 2:我如何将指令应用于净化的 html/innerhtml

Posted

技术标签:

【中文标题】Angular 2:我如何将指令应用于净化的 html/innerhtml【英文标题】:Angular 2: How can I apply directives to sanitized html/innerhtml 【发布时间】:2018-02-23 07:35:58 【问题描述】:

我正在开发一个应用程序,我从服务器获取 html 格式的响应。 我正在使用 DomSanitizer 的 bypassSecurityTrustHtml 并将经过清理的 html 添加到我的组件 ()。

我的问题是响应中的一些元素包含标记以指示可以从元素构建链接,例如:

<div thisIsActuallyaLink linkParam1="foo" linkParam2="bar">clickHere</div>

我想创建一个应用于 innerhtml 的指令,但是在显示 html 时,它没有用我的指令编译...

如果有人想知道为什么没有在服务器端转换 html:响应在多个应用程序中使用,并且链接必须具有不同的相对 url,具体取决于应用程序:-(

【问题讨论】:

[innerHTML]="..." 根本不可能。您可以在运行时编译组件以获得动态 HTML ***.com/questions/38888008/… 的组件和指令 我的项目需要 AoT 编译。动态组件看起来很有希望,但我猜它不适用于 AoT?我决定暂时在“ngAfterViewInit()”期间解析 html 并将标签转换为纯链接(失去 routerLinks 的单页功能)。 我不知道当前的状态。几个月前有一个关于这个的讨论,看起来有办法让它协同工作。不确定从那以后情况是否有所改善/恶化。讨论在 Angular Github 问题中。 我仔细研究了这个,它似乎可以与 AoT 编译器一起使用。如果您将此作为答案提交,我会将其标记为正确 【参考方案1】:

[innerHTML]="..." 根本不可能做到这一点。 您可以在运行时编译组件以获得动态 HTML 的组件和指令。

更多详情请见How can I use/create dynamic template to compile dynamic Component with Angular 2.0?。

【讨论】:

【参考方案2】:

也许可以尝试使用 Pipe,如下所示:

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

@Pipe( name: 'safeHTML' )
export class SafeHtml implements PipeTransform 

    constructor(private sanitizer: DomSanitizer)  

    transform(html: string) 
        return this.sanitizer.bypassSecurityTrustHtml(html)
    
 

并且比 [innerHtml]="htmlExample | safeHTML"

【讨论】:

这就是 domsanitizer 的工作原理。它类似于我已经在做的,但它在编译期间不使用角度指令(如 routerLink),所以这不能解决我的问题。

以上是关于Angular 2:我如何将指令应用于净化的 html/innerhtml的主要内容,如果未能解决你的问题,请参考以下文章

Angular:如何使用 *ngFor 将指令绑定到元素

相对于 .js 文件的 Angular 指令 templateUrl

单击时来自组件的Angular2触发指令

Angular 2:如何有条件地应用属性指令?

如何使用 angularJS 将可拖动指令应用于引导模式?

如何在Angular 2中使用ngStyle将transform translate属性应用于元素