Angular 中的 ElementRef


ElementRef 顾名思义是元素参阅。

其实在实际应用中就是获取视图层的dom元素,借助Augular提供的依赖注入机制,轻松的访问到dom元素。


ElementRef的定义

 export class ElementRef {
      public nativeElement: any;
      constructor(nativeElement: any) { this.nativeElement = nativeElement; }
}

ElementRef的应用

我们先来介绍一下整体需求,我们想在页面成功渲染后,获取页面中的 div 元素,并改变该 div 元素的背景颜色。接下来我们来一步步,实现这个需求。

首先我们要先获取 div 元素,在文中 "ElementRef 的作用" 部分,我们已经提到可以利用 Angular 提供的强大的依赖注入特性,获取封装后的 native 元素。在浏览器中 native 元素就是 DOM 元素,我们只要先获取 my-app元素,然后利用 querySelector API 就能获取页面中 div 元素。具体代码如下:

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

@Component({
    selector: 'my-app',
    template: `
      

Welcome to Angular World

Hello {{ name }}
`, }) export class AppComponent { name: string = 'mh'; constructor(private elementRef: ElementRef) { let divEle = this.elementRef.nativeElement.querySelector('div'); console.dir(divEle); } }

运行上面代码,在控制台中没有出现异常,但是输出的结果却是 null 。什么情况 ? 没有抛出异常,我们可以推断 this.elementRef.nativeElement 这个对象是存在,但却找不到它的子元素,那应该是在调用构造函数的时候,my-app 元素下的子元素还未创建。那怎么解决这个问题呢 ?沉思中… ,angular内部提供了声明周期钩子,那我们来改造一波:

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

@Component({
  selector: 'my-app',
  template: `
    

Welcome to Angular World

Hello {{ name }}
`, }) export class AppComponent { name: string = 'xiaowang'; // 在构造函数中 this.elementRef = elementRef 是可选的,编译时会自动赋值 // function AppComponent(elementRef) { this.elementRef = elementRef; } constructor(private elementRef: ElementRef) { } ngAfterViewInit() { // 模板中的元素已创建完成 console.dir(this.elementRef.nativeElement.querySelector('div')); // let greetDiv: HTMLElement = this.elementRef.nativeElement.querySelector('div'); // greetDiv.style.backgroundColor = 'red'; } }

上述的代码中,我们用了ngAfterViewInit 这个钩子,也是顾名思义,在视图初始化完毕之后调用,这样就可以成功的获取template中的dom节点元素啦。


未完待续。

你可能感兴趣的:(Angular 中的 ElementRef)