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 相关文章推荐
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
javascript-简单的计算器实现步骤分解(附图)
May 30 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
Jul 12 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
手机号码,密码正则验证
Sep 04 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
Jun 15 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
May 08 Javascript
基于layui内置模块(element常用元素的操作)
Sep 20 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
Sep 23 Javascript
javascript中layim之查找好友查找群组
Feb 06 Javascript
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
php递归方法实现无限分类实例代码
2014/02/28 PHP
教大家制作简单的php日历
2015/11/17 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python里dict变成list实例方法
2019/06/26 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
Python如何实现动态数组
2019/11/02 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
汉语言文学毕业生求职信
2013/10/01 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
新春联欢会主持词
2014/03/24 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
学生党员检讨书范文
2014/12/27 职场文书
消防宣传语大全
2015/07/13 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书