前言

有时不得不面对一些需要在组件中直接操作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元素后,可以采用类似的方式处理。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家的支持。
# angular2
# dom
# angularjs2
# tab组件
# 详解Angular 4.x 动态创建组件
# Angular 2父子组件数据传递之@ViewChild获取子组件详解
# angular中不同的组件间传值与通信的方法
# Angular父组件调用子组件的方法
# Angular5给组件本身的标签添加样式class的方法
# Angular 2父子组件数据传递之@Input和@Output详解(下)
# Angular入口组件(entry component)与声明式组件的区别详解
# angular2倒计时组件使用详解
# 详解angular2封装material2对话框组件
# 简单谈谈Angular中的独立组件的使用
# 的是
# 是一个
# 修饰符
# 看着
# 都有
# 第一个
# 这个时候
# 可以看出
# 这篇文章
# 谢谢大家
# 则可
# 设置为
# 来实现
# 贴上
# 便能
# 官网
# 值为
# 可以用来
# 很相似
# 时则
相关文章:
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何通过商城自助建站源码实现零基础高效建站?
建站主机功能解析:服务器选择与快速搭建指南
深入理解Android中的xmlns:tools属性
如何在阿里云部署织梦网站?
建站主机是否等同于虚拟主机?
建站之星代理如何优化在线客服效率?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
C++如何编写函数模板?(泛型编程入门)
宝塔新建站点报错如何解决?
如何通过NAT技术实现内网高效建站?
建站主机默认首页配置指南:核心功能与访问路径优化
如何获取开源自助建站系统免费下载链接?
Python多线程使用规范_线程安全解析【教程】
香港网站服务器数量如何影响SEO优化效果?
建站org新手必看:2024最新搭建流程与模板选择技巧
制作网站怎么制作,*游戏网站怎么搭建?
在线教育网站制作平台,山西立德教育官网?
C#如何在一个XML文件中查找并替换文本内容
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
定制建站价位费用解析与套餐推荐全攻略
如何在企业微信快速生成手机电脑官网?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
建站主机选哪种环境更利于SEO优化?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
建站之星如何快速生成多端适配网站?
如何在VPS电脑上快速搭建网站?
建站之星如何快速更换网站模板?
网站微信制作软件,如何制作微信链接?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
高端建站如何打造兼具美学与转化的品牌官网?
音响网站制作视频教程,隆霸音响官方网站?
网页设计网站制作软件,microsoft office哪个可以创建网页?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
官网建站费用明细查询_企业建站套餐价格及收费标准指南
完全自定义免费建站平台:主题模板在线生成一站式服务
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
,想在网上投简历,哪几个网站比较好?
如何通过山东自助建站平台快速注册域名?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何在万网自助建站中设置域名及备案?
建站主机选购指南与交易推荐:核心配置解析
如何通过可视化优化提升建站效果?
电商网站制作公司有哪些,1688网是什么意思?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
php json中文编码为null的解决办法
如何在云指建站中生成FTP站点?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
*请认真填写需求信息,我们会在24小时内与您取得联系。