如何在ElementRef(nativeEelement)中设置HTML内容?

How to set HTML content in the ElementRef (nativeEelement)?

我想用指令设置 HTML 元素的内容。

export class AdvertisementDirective {

  constructor(el: ElementRef) {
    el.nativeElement.style.background = 'yellow';
    el.nativeElement.content = '<p>Hello World<p>';
  }

}

但是它不起作用,也没有给出任何错误。

这样做的想法是在指令中包含广告代码,并在我使用指令属性的任何地方设置它。广告代码包含JavaScript和HTML代码。

刚刚用以下方法修复了它:

el.nativeElement.innerHTML = '<p>Hello World<p>';

我意识到 nativeElement 应该接受所有 JavaScript 方法,因为它是原生 HTML 元素。

DOM 通过直接更改 nativeElement 上的属性进行操作不被认为是一种好的做法。它在某些情况下也不会工作,例如使用 Angular Universal 的 Web Workers 和服务器端渲染。

更安全的方法是使用 Renderer2.

import { ..., AfterViewInit, ElementRef, ViewChild, Renderer2, ... } from '@angular/core';
...
export class AdvertisementDirective implements AfterViewInit {

  @ViewChild('templateRefName') el: ElementRef;

  constructor(
    private renderer: Renderer2
  ) {
  }

  ngAfterViewInit() {
    this.renderer.setStyle(this.el.nativeElement, 'background', 'yellow');
    this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '<p>Hello World<p>');
  }

}

并在模板中:

<div #templateRefName></div>

附加文本也可以通过使用 renderer2 对象的 createText 属性 来实现。

    import {ElementRef, ViewChild, Renderer2} from '@angular/core';


export class AdvertisementDirective {

  @ViewChild('templateRefName') el: ElementRef;

  constructor(
    private renderer: Renderer2
  ) {
  }

  ngOnInit() {

   const text = this.renderer.createText('Hello World'); // <-- TO Be Noted
    this.renderer.appendChild(this.el.nativeElement, text);

  }

}