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函数问题解决【解答】
如何用已有域名快速搭建网站?
下一篇:阿里云空间建站安全防护全攻略
下一篇:阿里云空间建站安全防护全攻略

