基于某些特殊情况,在使用框架时,或者历史遗留问题,还是需要操作DOM对象

此时可在DOM上添加模板引用变量 # 来标识DOM对象

<input #phone placeholder="phone number" (click)="method(phone.value)">

在控制器TS文件中怎么引用呢?

@viewChild('phone') private phone: any; //这里实际类型为下文的ElementRef

this.phone.nativeElement.setAttribute('style', `margin-left:${-(this.selectedIndex + 1 - this.showNumber) * 70}px`);

this.phone.nativeElement即为DOM对象


信息补全

ElementRef

对视图中某个原生元素的包装器。

class ElementRef<T> {
  constructor(nativeElement: T)
  nativeElement: T
}
属性说明
nativeElement: T背后的原生元素,如果不支持直接访问原生元素,则为 null(比如:在 Web Worker 环境下运行此应用的时候)。

当需要直接访问 DOM 时,请把本 API 作为最后选择。优先使用 Angular 提供的模板和数据绑定机制。或者你还可以看看 Renderer2,它提供了可安全使用的 API —— 即使环境没有提供直接访问原生元素的功能。

如果依赖直接访问 DOM 的方式,就可能在应用和渲染层之间产生紧耦合。这将导致无法分开两者,也就无法将应用发布到 Web Worker 中。

Last modification:November 12, 2019
如果觉得文章对你有所收获,可以请笔者喝杯咖啡