详解如何在Angular中快速定位DOM元素


Posted in Javascript onMay 17, 2017

在使用Angular2+中,经常会想快速的去选择DOM上的某个元素,如果是刚上手Angular,有可能直接就使用原生DOM操作或者导入jQuery再进行DOM操作,既然都使用了Angular了,有没有更好的方法呢?答案是肯定的。

通过ElementRef

先上代码:

import {Component, ElementRef, OnInit} from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 color:string;
 title = 'button !';
 constructor(private el:ElementRef){}
 setHeight(){
  this.el.nativeElement.querySelector('.btn1').style.height = '300px';
 }
 ngOnInit(){
  this.setHeight();
 }
}
<h1>
 {{title}}
</h1>
<div>
<button myHighlight class="btn btn1">按钮一</button>
<button myHighlight class="btn">按钮二</button>
<button myHighlight class="btn">按钮三</button>
</div>

效果是这样:

详解如何在Angular中快速定位DOM元素

上述代码中的nativeElement其实包含的是组件中所有的DOM元素,如下图所示:

详解如何在Angular中快速定位DOM元素

通过调用querySelectorAPI就能获取页面元素,需要注意的是querySelector只返回第一个元素,当你需要选择多个元素的时候可以使用querySelectorAll

通过@viewChild

<h1>
 {{title}}
</h1>
<div>
<button myHighlight class="btn btn1">按钮一</button>
<button myHighlight class="btn" #btn>按钮二</button> <!--增加一个变量-->
<button myHighlight class="btn">按钮三</button>
</div>
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 @ViewChild('btn') btn:ElementRef;//通过@ViewChild获取元素
 color:string;
 title = 'button !';
 constructor(private el:ElementRef){}
 setHeight(){
  this.el.nativeElement.querySelector('.btn1').style.height = '300px';
 }
 setWidth(){
  this.btn.nativeElement.style.width = '200px';//定义宽度
 }
 ngOnInit(){
  this.setHeight();
  this.setWidth();
 }
}

效果如下:

详解如何在Angular中快速定位DOM元素

如果多个HTML元素都定义了相同的变量,使用@viewChild时只能选择到第一个元素。

更好的方法是配合renderer2对象提供的API去实现同样的效果,这样减少应用层与渲染层之间强耦合关系:

import {Component, ElementRef, OnInit, Renderer2, ViewChild} from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 @ViewChild('btn') btn:ElementRef;
 color:string;
 title = 'button !';
  //初始化renderer2
 constructor(private el:ElementRef,private renderer2: Renderer2){}
 setHeight(){
  this.el.nativeElement.querySelector('.btn1').style.height = '300px';
 }
 setWidth(){
  // this.btn.nativeElement.style.width = '200px';
  
  //使用renderer2的setStyle方法设置宽度
  this.renderer2.setStyle(this.btn.nativeElement,'width','200px')
 }
 ngOnInit(){
  this.setHeight();
  this.setWidth();
 }
}

参考文章中都提到了@viewChild配合renderer选择元素,但是在Angular4renderer已经废弃掉了,变成了renderer2

renderer2API中还有其他的一些方法可以用来进行一些DOM操作:

class Renderer2 {
 data : {[key: string]: any}
 destroy() : void
 createElement(name: string, namespace?: string) : any
 createComment(value: string) : any
 createText(value: string) : any
 destroyNode : (node: any) => void |
 appendChild(parent: any, newChild: any) : void
 insertBefore(parent: any, newChild: any, refChild: any) : void
 removeChild(parent: any, oldChild: any) : void
 selectRootElement(selectorOrNode: string|any) : any
 parentNode(node: any) : any
 nextSibling(node: any) : any
 setAttribute(el: any, name: string, value: string, namespace?: string) : void
 removeAttribute(el: any, name: string, namespace?: string) : void
 addClass(el: any, name: string) : void
 removeClass(el: any, name: string) : void
 setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2) : void
 removeStyle(el: any, style: string, flags?: RendererStyleFlags2) : void
 setProperty(el: any, name: string, value: any) : void
 setValue(node: any, value: string) : void
 listen(target: 'window'|'document'|'body'|any, eventName: string, callback: (event: any) => boolean | void) : () => void
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript动画之圆形运动,环绕鼠标运动作小球
Jul 20 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
Feb 04 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
May 12 Javascript
jQuery选择器源码解读(一):Sizzle方法
Mar 31 Javascript
JS实现样式清新的横排下拉菜单效果
Oct 09 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 Javascript
jQuery插件zTree实现删除树子节点的方法示例
Mar 08 Javascript
Centos6.8下Node.js安装教程
May 12 Javascript
JS实现图片旋转动画效果封装与使用示例
Jul 09 Javascript
javascript面向对象三大特征之封装实例详解
Jul 24 Javascript
vue2.0中goods选购栏滚动算法的实现代码
May 17 #Javascript
AngularJS自定义指令实现面包屑功能完整实例
May 17 #Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
May 17 #jQuery
AngularJS使用拦截器实现的loading功能完整实例
May 17 #Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 #Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 #Javascript
bootstrap轮播图示例代码分享
May 17 #Javascript
You might like
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
浅谈 vue 中的 watcher
2017/12/04 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
django API 中接口的互相调用实例
2020/04/01 Python
Python 创建TCP服务器的方法
2020/07/28 Python
Python远程linux执行命令实现
2020/11/11 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
医药专业应届毕业生求职信范文
2014/01/01 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
辩护词范文大全
2015/05/21 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
合作意向书范本
2019/04/17 职场文书
python中print格式化输出的问题
2021/04/16 Python