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: `
<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节点元素啦。
未完待续。
网友评论