Angular2 innerHTML удаляет свойство, помощь, необходимую для использования DomSanitizer
Мне просто нужно ввести HTML в div с 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 должен использовать [property] = binding: abc
(см. http://g.co/ng/security)
Почему мне нужно реализовать это - потому что, когда я внедряю innerHTML, я теряю свойство contenteditable="true"
Перед применением innerHTML мой код выглядит так, как показано ниже:
<h1 _ngcontent-c2 contenteditable="true">Hii<h2>
После применения innerHTML это становится:
<h1 _ngcontent-c2>Hii<h2>
Пожалуйста, помогите мне решить проблему
1 ответ
Вся методология angular основана на сокращении манипуляций с DOM с помощью сценария (например, того, что у вас есть), как это рекомендовано в http://angularjs.blogspot.com.au/2016/04/5-rookie-mistakes-to-avoid-with-angular.html.
Есть очень немного обстоятельств, когда манипулирование DOM напрямую необходимо. Angular 2 предоставляет набор мощных высокоуровневых API, таких как запросы, которые можно использовать вместо этого. Использование этих API дает несколько явных преимуществ.
...
Когда вы манипулируете DOM вручную, вы упускаете эти преимущества и в конечном итоге пишете менее выразительный код.
Так что вместо того, чтобы использовать это: this.document.getElementById("main-wrapper").innerHTML +=
Вы должны использовать шаблоны движка / структурные директивы, такие как *ngFor *ngIf
присущ угловой.
// .html
<div class="main-wrapper"><p *ngIf="showabc">abc</p></div>
// .ts
var showabc: Boolean = true;
Согласно вашему комментарию:
Вы загружаете кучу html из localalstorage. В этом случае вам придется манипулировать DOM. В идеале я бы порекомендовал переконфигурировать эту архитектуру для повышения производительности, как указано выше.
Во-первых, загрузите HTML в машинописный текст...
public possibleHTML: Array;
constructor(private sanitizer: DomSanitizer){}
ngOnInit(){
this.possibleHTML = loadContentFromLocalStorage();
this.possibleHTML = this.possibleHTML.map(value => this.sanitizer.bypassSecurityTrustHtml(value));
}
2-й вставить 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
,