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 相关文章推荐
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
Jul 21 Javascript
js兼容标准的表格变色效果
Jun 28 Javascript
jQuery源码分析之Event事件分析
Jun 07 Javascript
js正则表达式的使用详解
Jul 09 Javascript
如何让DIV可编辑、可拖动示例代码
Sep 18 Javascript
JQuery学习总结【一】
Dec 01 Javascript
JavaScript中localStorage对象存储方式实例分析
Jan 12 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
koa router 多文件引入的方法示例
May 22 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 Javascript
微信小程序纯文本实现@功能
Apr 08 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 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脚本的10个技巧(3)
2006/10/09 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
js函数排序的实例代码
2013/07/01 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
Python多线程学习资料
2012/12/19 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Python configparser模块常用方法解析
2020/05/22 Python
如何用Python 加密文件
2020/09/10 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
个人自我评价分享
2013/12/20 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
白鹤梁导游词
2015/02/06 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang