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 年月日联动实现核心代码
Dec 21 Javascript
使用Math.floor与Math.random取随机整数的方法详解
May 07 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 Javascript
jQuery中获取checkbox选中项等操作及注意事项
Nov 24 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
Jul 02 Javascript
jquery.validate使用时遇到的问题
May 25 Javascript
简介JavaScript中的getSeconds()方法的使用
Jun 10 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
Jan 14 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
May 12 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
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时间戳使用实例代码
2008/06/07 PHP
PHP mkdir()定义和用法
2009/01/14 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
Javascript操作URL函数修改版
2013/11/07 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
js 颜色选择插件
2017/01/23 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python文件的读写和异常代码示例
2017/10/31 Python
Django数据库表反向生成实例解析
2018/02/06 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
踏青活动策划方案
2014/08/19 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
四年级学生期末评语
2014/12/26 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
走进毛泽东观后感
2015/06/04 职场文书
学子宴致辞大全
2015/07/27 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android