ElementRef 顾名思义是元素参阅
在实际应用中获取视图层的dom元素,借助Angular提供的依赖注入机制,轻松访问到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: `
<h1>Welcome to Angular World</h1>
<div>Hello {{ name }}</div>
`,
})
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: `
<h1>Welcome to Angular World</h1>
<div>Hello {{ name }}</div>
`,
})
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节点元素啦