美文网首页
Angular中添加InnerHtml无法现实scss样式

Angular中添加InnerHtml无法现实scss样式

作者: 321小马过河 | 来源:发表于2019-12-02 00:46 被阅读0次

无法应用.css文件中的样式

近期在做一个angular的小工具,通过ts动态更新元素的innerHtml属性的时候发现元素是追加上去了,但是样式却没有应用,作为一个面向搜索引擎的开发者,找了很久之后终于获得了想要的答案,话不多说,代码如下:

html代码:

<div class="preview-container" id="preview-container" [innerHtml] = "content">
</div>

ts代码:

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

@Component({
  selector: 'app-preview',
  templateUrl: './preview.component.html',
  styleUrls: ['./preview.component.scss']
})
export class PreviewComponent implements OnInit {
  content = null;
  constructor() {}
  ngOnInit() {
     this.content = "<h1></h1>";
  }
}

scss样式:

h1{
  background-color: yellow;
}

本来期望是在组件初始化的时候追加一行h1元素,背景为黄色,但是由于angular给css的class加入了前缀,或者对html元素的一些属性做了自动的更改,导致你在自己追加innerHtml代码的时候,这些css样式选择器无法匹配,所以最终解决办法就是关闭angular的自动添加前缀功能,修改后的ts代码如下:

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

@Component({
  selector: 'app-preview',
  templateUrl: './preview.component.html',
  encapsulation: ViewEncapsulation.None,
  styleUrls: ['./preview.component.scss']
})
export class PreviewComponent implements OnInit {
  content = null;
  constructor() {}
  ngOnInit() {
     this.content = "<h1></h1>";
  }
}

无法应用sytle属性中添加的样式

另外值得一提的是,在查找上面的问题时候,发现一个类似的问题,就是在设置innerHtml时候,如果你的innerHtml中添加的代码设置了style属性来调整其样式,那么很可能是不会起作用的,这个应该是出于安全考虑(浏览器防止注入攻击?),对于innerHtml中style属性未进行加载渲染,解决办法也很简单,就是利用angular自带的DomSanitizer进行转换一下即可:

import { Component, OnInit } from '@angular/core';
import { ViewEncapsulation } from '@angular/core';
import { DomSanitizer} from '@angular/platform-browser';

@Component({
  selector: 'app-preview',
  templateUrl: './preview.component.html',
  encapsulation: ViewEncapsulation.None,
  styleUrls: ['./preview.component.scss']
})
export class PreviewComponent implements OnInit {
  content = null;
  constructor(private sanitized: DomSanitizer) {}
  
ngOnInit() {
    this.content =  this.sanitized.bypassSecurityTrustHtml( "<h1 style="font-size: 80px"></h1>");
  }
}

当然,也可以写成pipe的形式,这样就不需要修改前面的component.ts文件,也方便代码重用:
Pipe代码如下:

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

@Pipe({
  name: 'html'
})
export class HtmlPipe implements PipeTransform {
  constructor(private sanitized: DomSanitizer) {}
  
  transform(value: string): any {
    return this.sanitized.bypassSecurityTrustHtml(value);
  }
}

html文件如下:

<div class="preview-container" id="preview-container" [innerHtml] = "content | html">
</div>

到此为止,就可以顺利的更新innerHtml代码了,如有疑问,欢迎留言讨论。

相关文章

网友评论

      本文标题:Angular中添加InnerHtml无法现实scss样式

      本文链接:https://www.haomeiwen.com/subject/kqtxgctx.html