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 相关文章推荐
调试Node.JS的辅助工具(NodeWatcher)
Jan 04 Javascript
js给onclick赋值传参数的两种方法
Nov 25 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
Apr 03 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
js实现自定义进度条效果
Mar 15 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 Javascript
webpack-dev-server自动更新页面方法
Feb 22 Javascript
解决vue-cli + webpack 新建项目出错的问题
Mar 20 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 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
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
PHP7 list() 函数修改
2021/03/09 PHP
js查找父节点的简单方法
2008/06/28 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
pygame实现打字游戏
2021/02/19 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
高考自主招生自荐信
2013/10/20 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
教师业务学习制度
2014/01/25 职场文书
大学生作弊检讨书
2014/02/19 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
大学生个人求职信例文
2014/07/07 职场文书
工伤事故证明
2014/10/20 职场文书
在职证明范本
2015/06/15 职场文书
售房协议书范本
2015/08/11 职场文书