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 相关文章推荐
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
javascript 中that的含义示例介绍
May 14 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
js判断上传文件后缀名是否合法
Jan 28 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 Javascript
微信小程序支付及退款流程详解
Nov 30 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
Nov 13 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
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
PHP实现图片压缩
2020/09/09 PHP
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python定时器(Timer)用法简单实例
2015/06/04 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
python数据结构之链表的实例讲解
2017/07/25 Python
python删除服务器文件代码示例
2018/02/09 Python
对Python中的@classmethod用法详解
2018/04/21 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
淘宝店铺营销方案
2014/02/13 职场文书
节能减排倡议书
2014/04/15 职场文书
2015年招聘工作总结
2014/12/12 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL