全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Angular2学习教程之组件中的DOM操作详解

前言

有时不得不面对一些需要在组件中直接操作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小时内与您取得联系。