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中document对象使用详解
Jan 06 Javascript
JavaScript学习笔记之DOM基础 2.4
Aug 14 Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
require.js配合插件text.js实现最简单的单页应用程序
Jul 12 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 Javascript
微信小程序页面间跳转传参方式总结
Jun 13 Javascript
Vue的生命周期操作示例
Sep 17 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 Javascript
js实现弹框效果
Mar 24 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
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
php 文件上传实例代码
2012/04/19 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
详解Vue中的watch和computed
2020/11/09 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
利用Python开发微信支付的注意事项
2016/08/19 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
python实现复制文件到指定目录
2019/10/16 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
Internet体系结构
2014/12/21 面试题
酒店led欢迎词
2014/01/09 职场文书
党员干部承诺书
2014/03/25 职场文书
春季防火方案
2014/05/10 职场文书
庆七一活动总结
2014/08/27 职场文书
一般纳税人申请报告
2015/05/18 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
go 实现简易端口扫描的示例
2021/05/22 Golang