样式不适用于Angular 2 Typescript中的innerhtml

Cha*_*tra 40 html css angular

我将html作为innerHtml传递给我的视图.以下是我的观点

<div [innerHTML]="someHtmlCode"></div>
Run Code Online (Sandbox Code Playgroud)

如果我通过以下代码,它工作正常.

this.someHtmlCode = "<div><b>This is my HTML.</b></div>"
Run Code Online (Sandbox Code Playgroud)

如果我传递下面包含颜色的代码,它就无法正常工作.

 this.someHtmlCode = '<div style="background-color: blue;"><b>This is my HTML.</b></div>';
Run Code Online (Sandbox Code Playgroud)

Uns*_*Sam 94

你得到的这种行为是正常的.添加的类innerHTML被忽略,因为默认情况下封装是Emulated.这意味着Angular会阻止样式拦截组件的内部和外部.您应该将封装更改为None组件中的封装.这样一来,你就可以定义任何你想要类:内styles或在一个单独的.css,.scss或者.less样式表(没关系)和角度将它们自动添加到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>';
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,将 ViewEncapsulation 更改为 None 可能会产生相当深远的影响。这会在全局范围内应用您的样式 - 因此,如果您将 div 标签之类的内容设置为具有背景颜色,这将更改应用程序中的所有 div 以具有该背景颜色。除非绝对必要,否则我会避免更改 ViewEncapsulation。 (20认同)
  • 如果我没有上课只传递风格它不起作用 (8认同)
  • `ViewEncapsulation`是角度/核心的一部分:`@ {核心/核心'的导入{ViewEncapsulation};` (8认同)
  • @Chatra您可能想看看[this](https://angular.io/api/platform-b​​rowser/DomSanitizer) (3认同)
  • 确保从 @angular/core 导入 ViewEncapsulation 而不是从 @angular/compiler/src/core 导入。否则,你最终会得到一个神秘的错误——“找不到模块 'tslib'”! (3认同)
  • 您是对的,我找不到使它起作用的解决方案:)但是,我建议您不要使用内联样式,因为将其混入模板中不是一个好习惯。 (2认同)
  • 天啊,你是化身。我已经在这个问题上挠头两天了。非常感谢。 (2认同)
  • 您还可以使用:host ::ng-deep 或仅使用::ng-deep 来应用样式。您需要在样式文件中声明这些修饰符。 (2认同)
  • 问题是关于使用显式内联样式,而不是类。 (2认同)

She*_*hir 7

我也面临同样的问题,但在阅读下面的链接后,我想出了解决方案,并且没有使用管道

希望这会帮助你.

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

  • 谢谢。我在使用鹅毛笔编辑器创建的innerHTML代码时遇到了类似的问题。禁用 ViewEncapulation 不适用于样式等每个属性,例如 - 因此您可以使用 `&lt;div [innerHTML]="sanitizer.bypassSecurityTrustHtml(yourObject.note)"&gt;&lt;/div&gt;` 并将其添加到构造函数 `public sanitizer: DomSanitizer` 当然要小心 XSS!!! (2认同)