Angular2学习教程之组件中的DOM操作详解


Posted in Javascript onMay 28, 2017

前言

有时不得不面对一些需要在组件中直接操作DOM的情况,如我们的组件中存在大量的CheckBox,我们想获取到被选中的CheckBox,然而这些CheckBox是通过循环产生的,我们无法给每一个CheckBox指定一个ID,这个时候可以通过操作DOM来实现。angular API中包含有viewChild,contentChild等修饰符,这些修饰符可以返回模板中的DOM元素。

指令中的DOM操作

@Directive({
 selector: 'p'
})
export class TodoDirective{
 constructor(el: ElementRef, renderer: Renderer){
  renderer.setElementStyle(el.nativeElement, 'backgroundColor', 'red');
 }
}

以上声明了一个指令,使用是需要在module中的declarations中声明。该指令的作用是将p元素的backgroundColor设置为red。

-ElementRef是一个允许直接获取DOM元素的一个类,该类包含一个nativeElement属性。当不允许直接操作原生DOM元素时,该属性值为null。

-Renderer该类包含大量可以用来操作DOM原生的方法。

@ViewChild和@ViewChildren

每一个组件都有一个视图模板,通过 template或templateUrl引入。想要获取视图模板中的DOM元素则可以使用@ViewChild和@ViewChildren修饰符。他们可以接受模板变量或元素标签或模板类名来获取DOM节点。@ViewChild返回ElementRef类引用(获取组件时则直接使用组件类名),而@ViewChildren返回QueryList<ElementRef>

//模板内容
<p *ngFor='let item of todos' #name>{{ item.name }}</p>

//组件中获取DOM
@ViewChildren('name')
todoNames: QueryList<ElementRef>;

@ViewChild('name')
todoName: ElementRef;
ngAfterViewInit(){
 this.todoNames.forEach(e=>console.log(e.nativeElement.innerText));
 console.log(this.todoName.nativeElement.innerText);
}

@ViewChild('name')和@ViewChildren('name')通过name模板变量获取p标签DOM节点,可以在ngAfterViewInit声明周期钩子中获取节点信息,当然也可以在其他函数中,只要保证视图完成初始化即可。

QueryList是一个不可变的列表,其存在一个名为changes的Observable变量,因此可以被订阅,结合notifyOnChanges方法,可以实时查看QueryList中变量的变化。调用notifyOnChanges函数后,当组件的输入发生变化时会触发Observable发出新的值,这样当todoNames: QueryList<ElementRef>有更新时,便能通过下面代码查看到变化:

this.todoNames.changes.subscribe(data => data._results.forEach(
 e=>console.log(e.nativeElement.innerText)));
this.todoNames.notifyOnChanges();

@ContentChild和@ContentChildren

看着与@ViewChild和@ViewChildren很相似,但@ContentChild和@ContentChildren是获取组件标签中的内容的,懒得写例子,这里直接贴上angular中文官网的一个例子:

import {Component, ContentChildren, Directive, Input, QueryList} from '@angular/core';
@Directive({selector: 'pane'})
export class Pane {
 @Input() id: string;
}
@Component({
 selector: 'tab',
 template: `
 <div>panes: {{serializedPanes}}</div> 
 `
})
export class Tab {
 @ContentChildren(Pane) panes: QueryList<Pane>;
 get serializedPanes(): string { return this.panes ? this.panes.map(p => p.id).join(', ') : ''; }
}
@Component({
 selector: 'example-app',
 template: `
 <tab>
  <pane id="1"></pane>
  <pane id="2"></pane>
  <pane id="3" *ngIf="shouldShow"></pane>
 </tab>
 <button (click)="show()">Show 3</button>
 `,
})
export class ContentChildrenComp {
 shouldShow = false;
 show() { this.shouldShow = true; }
}

可以看出@ContentChildren(Pane) panes: QueryList<Pane>;获取的是组件Tab中的内容:

<tab>
  <pane id="1"></pane>
  <pane id="2"></pane>
  <pane id="3" *ngIf="shouldShow"></pane>
 </tab>

与@ViewChild类似@ContentChild获取的是第一个Pane指令,获取DOM元素后,可以采用类似的方式处理。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家三水点靠木的支持。

Javascript 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
IE下通过a实现location.href 获取referer的值
Sep 04 Javascript
jQuery给动态添加的元素绑定事件的方法
Mar 09 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
理解JavaScript事件对象
Jan 25 Javascript
微信小程序 slider 详解及实例代码
Jan 10 Javascript
Node.js创建Web、TCP服务器
Dec 05 Javascript
javascript实现的字符串转换成数组操作示例
Jun 13 Javascript
微信小程序 轮播图实现原理及优化详解
Sep 29 Javascript
js仿360开机效果
Dec 26 Javascript
原生js实现文件上传、下载、封装等实例方法
Jan 05 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
Angular2学习教程之ng中变更检测问题详解
May 28 #Javascript
Angular2使用jQuery的方法教程
May 28 #jQuery
Angular.js实现动态加载组件详解
May 28 #Javascript
利用node.js如何搭建一个简易的即时响应服务器
May 28 #Javascript
利用Angular.js编写公共提示模块的方法教程
May 28 #Javascript
Angular2入门教程之模块和组件详解
May 28 #Javascript
关于Angular2 + node接口调试的解决方案
May 28 #Javascript
You might like
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
python面试题之列表声明实例分析
2019/07/08 Python
python通过http下载文件的方法详解
2019/07/26 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
pandas-resample按时间聚合实例
2019/12/27 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
浅谈html5 响应式布局
2014/12/24 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
什么是Web Service?
2012/07/25 面试题
煤矿机修工岗位职责
2014/02/07 职场文书
岗位职责风险防控
2014/02/18 职场文书
考博专家推荐信
2014/05/10 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
初中信息技术教学反思
2016/02/16 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python