如何使用 Renderer2 在 Angular 中设置本机元素的值?

Posted

技术标签:

【中文标题】如何使用 Renderer2 在 Angular 中设置本机元素的值?【英文标题】:How can I set the value of a native element in Angular, using Renderer2? 【发布时间】:2018-09-14 05:43:21 【问题描述】:

我想设置 nativeElement 的 innerText/innerhtml/textContent?

this.render.setValue(this.nativeCloneLi.querySelector('.down .inn'), timeVal);

其中 timeVal 是一个字符串

正确选择了元素,但 setValue 似乎根本不起作用

【问题讨论】:

如何创建nativeCloneLi 使用 ElementRef instance.nativeElement 【参考方案1】:

您需要使用renderer.setProperty() 而不是renderer.setValue()

import  Component, Renderer2, AfterViewInit, ElementRef, ViewChild  from '@angular/core';

@Component(
  selector: 'my-app',
  template: `
  <div #el></div>
  `,
  styleUrls: [ './app.component.css' ]
)
export class AppComponent implements AfterViewInit 
  @ViewChild('el') el: ElementRef;

  constructor(private renderer: Renderer2) 

  ngAfterViewInit() 
    this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '<h1>Hello world</h1>');
  

Live demo

【讨论】:

如果我们只想读取原生元素上的值,我们是否也应该使用渲染器,例如 const top = this._elementRef.nativeElement.getBoundingClientRect().top; @abyrne85 我也很好奇,如果我们只想读取元素,是否应该使用渲染器。 @abyrne85, @calbear47 不,没有必要。 Renderer2 提供了一个 API 以与平台无关的方式操作原生元素。这意味着它将您从直接的 DOM 访问中解放出来,并允许您以抽象的方式对其进行操作。但只要您只阅读而不更改任何内容,您就可以直接使用本机元素(如果支持访问它们)或提供自定义 Renderer2 实现以及您缺少的功能。实际上 Angular 不提供任何支持(ElementRef 和 events 除外)从 DOM 获取任何东西。【参考方案2】:

我更喜欢这样做:

import  Component, Renderer2, AfterViewInit, ElementRef, ViewChild  from '@angular/core';

@Component(
  selector: 'my-app',
  template: `
  <div #el></div>
  `,
  styleUrls: [ './app.component.css' ]
)
export class AppComponent implements AfterViewInit 
  @ViewChild('el') el: ElementRef;

  constructor(private renderer: Renderer2) 

  ngAfterViewInit() 
    const h1 = this.renderer.createElement('h1');
    const text = this.renderer.createText('Hello world');

    this.renderer.appendChild(h1, text);
    this.renderer.appendChild(this.el.nativeElement, div);
  

【讨论】:

以上是关于如何使用 Renderer2 在 Angular 中设置本机元素的值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 指令中使用 CSS 悬停属性?

使用 Angular 指令在模板中绘制对象

Angular 指令创建重复元素

需要访问 Angular 5 指令文本

angular-ng-zorro,自定义模态窗拖动指令

typescript renderer2.ts