3

我只需要在 div 中注入 HTML id "main-wrapper",所以在我的 component.ts 中我正在使用这段代码

    import { Component, OnInit, ElementRef,Renderer2,Inject } from '@angular/core';
    import { Pipe } from '@angular/core';
    import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';

    @Component({
      selector: 'app-editsection',
      templateUrl: './editsection.component.html',
      styleUrls: ['./editsection.component.css']
    })

    export class EditsectionComponent implements OnInit {
    ...//some code

    constructor(
        @Inject(DOCUMENT) private document: any,
        private route: ActivatedRoute,
      private elRef: ElementRef,
      private el: ElementRef,
      private _sanitizer:DomSanitizer
      ) { }

    ngOnInit() {
    var strHTML = '<p>abc<p>';
     this.document.getElementById("main-wrapper").innerHTML += this._sanitizer.bypassSecurityTrustHtml(strHTML);

    ...
    }
    }

当我运行代码时,它说: SafeValue must use [property]=binding: abc

(见http://g.co/ng/security#xss

为什么我需要实现这个 - 因为当我注入 innerHTML 时,我失去了一个属性contenteditable="true"

在应用 innerHTML 之前,我的代码如下所示:

<h1 _ngcontent-c2 contenteditable="true">Hii<h2>

应用 innerHTML 后,它变为:

<h1 _ngcontent-c2>Hii<h2>

请帮我解决问题

4

1 回答 1

2

正如http://angularjs.blogspot.com.au/2016/04/5-rookie-mistakes-to-avoid-中所推荐的那样,Angular 背后的整个方法都基于通过脚本(例如您所拥有的)减少 DOM 操作与 angular.html

很少有需要直接操作 DOM 的情况。Angular 2 提供了一组功能强大的高级 API,例如可以使用的查询。利用这些 API 具有一些明显的优势

...

当您手动操作 DOM 时,您会错过这些优势,并最终编写出表达力较差的代码。


所以不要使用这个:this.document.getElementById("main-wrapper").innerHTML +=

您应该使用 Angular*ngFor *ngIf中固有的模板引擎/结构指令。

// .html
<div class="main-wrapper"><p *ngIf="showabc">abc</p></div>
// .ts
var showabc: Boolean = true;

根据您的评论:

您正在从 localstorage 加载一堆 html。在这种情况下,您将不得不操作 DOM。理想情况下,我建议出于性能目的重新配置此架构,如上文所述。

1st,将html加载到打字稿中......

public possibleHTML: Array; 
constructor(private sanitizer: DomSanitizer){}
ngOnInit(){  
   this.possibleHTML = loadContentFromLocalStorage();
   this.possibleHTML = this.possibleHTML.map(value => this.sanitizer.bypassSecurityTrustHtml(value));
}

第二次插入html。

<div class="main-wrapper">
    <content *ngIf="possibleHTML">
       <div *ngFor="let html of possibleHTML">
           <div *ngIf="html.makevisible" [innerHtml]="html"></div>
       </div>
    </content>
</div>

缺点:除非将 css 样式定义为全局样式表styles.css而不是editsection.component.css.

于 2017-06-15T00:31:37.030 回答