【问题标题】:Style not working for innerHTML in Angular [duplicate]样式不适用于Angular中的innerHTML [重复]
【发布时间】:2017-10-27 21:23:36
【问题描述】:

我将 html 作为 innerHtml 传递给我的视图。以下是我的看法

<div [innerHTML]="someHtmlCode"></div>

如果我通过下面的代码,它工作正常。

this.someHtmlCode = "<div><b>This is my HTML.</b></div>"

如果我通过以下包含颜色的代码,它就不起作用。

 this.someHtmlCode = '<div style="background-color: blue;"><b>This is my HTML.</b></div>';

【问题讨论】:

标签: html css angular


【解决方案1】:

你得到的这种行为是正常的。添加到innerHTML 的类被忽略,因为默认情况下封装是Emulated。这意味着 Angular 会阻止样式拦截组件的内部和外部。 您应该在组件中将封装更改为None。 这样,您就可以在任何地方定义类:在styles 或单独的.css.scss.less 样式表中(没关系),Angular 会将它们添加到自动生成 DOM。

import { Component, ViewEncapsulation } from '@angular/core';

@Component({
  selector: 'example',
  styles: ['.demo {background-color: blue}'],
  template: '<div [innerHTML]="someHtmlCode"></div>',
  encapsulation: ViewEncapsulation.None,
})
export class Example {
  private someHtmlCode = '';

  constructor() {
    this.someHtmlCode = '<div class="demo"><b>This is my HTML.</b></div>';
  }
}

【讨论】:

  • 如果我只通过没有类的样式它是行不通的
  • 你是对的,我找不到使它工作的解决方案:) 我建议你不要使用内联样式,因为将它混合在模板中不是一个好习惯.
  • @Chatra 你可能想看看this
  • ViewEncapsulation 是 angular/core 的一部分:import { ViewEncapsulation } from '@angular/core';
  • 确保从@angular/core 导入ViewEncapsulation,而不是从@angular/compiler/src/core。否则,你会得到一个神秘的错误——“找不到模块'tslib'”!
【解决方案2】:

我也遇到了同样的问题,但是在阅读了下面的链接后,我找到了解决方案,并且在不使用管道的情况下完成了

希望这会对你有所帮助。

https://netbasal.com/angular-2-security-the-domsanitizer-service-2202c83bd90

【讨论】:

  • 顺便说一句,这是正确的答案,我从 google api gmail 消息中提取 html 内容,其中包含内联样式,没有办法解决。使用这个解决方案,我设法以与 gmail 显示电子邮件相同的方式实际显示电子邮件的内容,希望我能给你一个 +200,节省了我的一天
  • 这不是@WtFudgE。一件事是注入HTML,是的,您需要/应该使用管道对其进行清理,另一件事是,一旦通过[innerHTML]注入代码,就可以通过组件的样式表对其进行样式设置。你不能 - 这是 Angular 多年前假设的一个错误,并且没有得到妥善处理。所以...要对其进行样式设置,您确实需要通过encapsulation: ViewEncapsulation.None 了解组件的封装
  • 谢谢。我在使用由羽毛笔编辑器创建的 innerHTML 代码时遇到了类似的问题。禁用 ViewEncapulation 不适用于样式等每个属性,例如- 所以你可以使用&lt;div [innerHTML]="sanitizer.bypassSecurityTrustHtml(yourObject.note)"&gt;&lt;/div&gt;并将其添加到构造函数public sanitizer: DomSanitizer当然要小心XSS!!!
  • 我无法让这个方法识别css变量,即var(--blue)
【解决方案3】:

我将样式放在一个类中,而不是内联样式。

不确定使用 class 是否适合您,但这里有一个 Plunker demo

HTML:

this.someHtmlCode = '<div class="demo"><b>This is my HTML.</b></div>'

CSS:

.demo{
    background-color: blue;
}

【讨论】:

  • 它不起作用,如果我的演示 css 在较少的文件中,有什么区别吗?
  • 如果 css 在全局 styles.css 文件中,但不在非全局 css 文件中,此方法有效。如果有人能解释其中的区别会很有帮助,但与此同时,我想我会发表评论,让其他人意识到这项工作取决于这些细节。
  • my-angular-component.html 有 &lt;div class="my-static-div" [innerHTML]="&lt;div class='my-dynamic-div'&gt;" (click)="handleStaticClick($event)" ... 然后在 my-angular-component.css 中使用 .my-static-div ::ng-deep .my-dynamic-div { color: blue; } 和 my-angular-component.ts public handleStaticClick(event) { if (event.srcElement.classList.contains('my-dynamic-div')) { this.handleDynamicClick(); }}
  • 我通过在类前放置选择器 ::ng-deep 解决了我的这个遮阳篷问题。