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

发布时间 - 2026-01-11 01:28:57    点击率:

前言

有时不得不面对一些需要在组件中直接操作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中的独立组件的使用  # 的是  # 是一个  # 修饰符  # 看着  # 都有  # 第一个  # 这个时候  # 可以看出  # 这篇文章  # 谢谢大家  # 则可  # 设置为  # 来实现  # 贴上  # 便能  # 官网  # 值为  # 可以用来  # 很相似  # 时则 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  网站优化排名时,需要考虑哪些问题呢?  ,网页ppt怎么弄成自己的ppt?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  JS碰撞运动实现方法详解  公司网站制作价格怎么算,公司办个官网需要多少钱?  魔方云NAT建站如何实现端口转发?  南京网站制作费用,南京远驱官方网站?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何在云虚拟主机上快速搭建个人网站?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  如何在七牛云存储上搭建网站并设置自定义域名?  如何快速启动建站代理加盟业务?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Java垃圾回收器的方法和原理总结  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  奇安信“盘古石”团队突破 iOS 26.1 提权  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel如何实现API速率限制?(Rate Limiting教程)  Python制作简易注册登录系统  手机软键盘弹出时影响布局的解决方法  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何在橙子建站上传落地页?操作指南详解  简历没回改:利用AI润色让你的文字更专业  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Android自定义listview布局实现上拉加载下拉刷新功能  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel如何配置任务调度?(Cron Job示例)  潮流网站制作头像软件下载,适合母子的网名有哪些?  个人摄影网站制作流程,摄影爱好者都去什么网站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何用已有域名快速搭建网站?