Angular开发学习笔记:Angular 正确使用 @ViewChild、@ViewChildren 访问 DOM、组件、指令

使用基于python的neurora进行表征相似性分析(RSA) 发现了一款用于表征分析的Python API,还是挺方便的,这里简单介绍一下进行表征相似性分析的使用方法。 阅读详情

Angular 正确使用 @ViewChild、@ViewChildren 访问 DOM、组件、指令

       @ViewChild和@ViewChildren是Angular提供给我们的装饰器,用于从模板视图中获取匹配的元素。需要注意的是@ViewChild和@ViewChildren会在父组件钩子方法ngAfterViewInit调用之前赋值。接下来我们来看下@ViewChild、@ViewChildren怎么使用。

一 选择器

       @ViewChild、@ViewChildren支持的选择器包括以下几种(@ViewChild、@ViewChildren的参数有以下几种):

1.1 class

       当然了这个class也是有条件的,必须是@Component或者@Directive修饰的clas。

1.2 模板应用变量。

       得解释下什么是模板应用变量。直接用一个例子来说明。
例如<my-component #cmp></my-component>里面的cmp就是模板应用变量。

1.3 子组件provider提供的类

       我们还是用实际的例子来说明,比如我们有一个子组件。代码如下

import {Component, OnInit} from '@angular/core';
import {ChildService} from './child.service';

@Component({
  selector: 'app-child',
  template: `
    <h1>自定义的一个子组件</h1>
  `,
  providers: [
    ChildService
  ]
})
export class ChildComponent implements OnInit {

  constructor(public childService: ChildService) {
  }

  ngOnInit() {
  }

}

       在上面的子组件里面provider里面提供了一个ChildService类。我们也是可以通过@ViewChild来拿到这个ChildService类的。代码如下

  @ViewChild(ChildService) childService: ChildService;

1.4 子组件provider通过string token提供的类

       我们还是用实际的例子来说明。子组件的pprovider通过 string token valued的形式提供了一个StringTokenValue类,string token 对应的是tokenService。

import {Component} from '@angular/core';
import {StringTokenValue} from './string-token-value';

@Component({
  selector: 'app-child',
  template: `
    <h1>自定义的一个子组件</h1>
  `,
  styleUrls: ['./child.component.less'],
  providers: [
    {provide: 'tokenService', useClass: StringTokenValue}
  ]
})
export class ChildComponent {


}

       在父组件里面我们也是可以拿到子组件provider的这个StringTokenValue类的。方式如下:

  @ViewChild('tokenService') tokenService: StringTokenValue;

1.5 TemplateRef

       当选择器是TemplateRef的时候,则会获取到html里面所有的ng-template的节点。实际例子如下:

  /**** @ViewChild(TemplateRef) @ViewChildren(TemplateRef)获取页面上的ng-template节点信息 ****/
  @ViewChild(TemplateRef) template: TemplateRef<any>;
  @ViewChildren(TemplateRef) templateList: QueryList<TemplateRef<any>>;

二 使用场景

2.1 DOM

       如果想通过@ViewChild、@ViewChildren访问到DOM节点的话都得先给相应的DOM节点设置模板应用变量。例如下面的domLabel就是一个模板应用变量。

<div #domLabel>cba</div>

2.1.1 获取DOM里面宿主视图

       咱们可以简单把div,input,label等等,当然了还包括我们自定义的一些组件都认为是宿主视图。用ElementRef变量接收到获取到的宿主视图元素。

ElementRef

import {AfterViewInit, Component, ElementRef, ViewChild} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <!-- view child dom -->
    <div #domLabel>
      abc
    </div>
  `,
  styleUrls: ['./app.component.less']
})
export class AppComponent implements AfterViewInit {
  /**** DOM节点对应的 ****/
    // DOM节点只能使用模板应用变量来找到
  @ViewChild('domLabel') domLabelChild: ElementRef; // 找到第一个符合条件的节点

  ngAfterViewInit(): void {
    // DOM节点
    console.log(this.domLabelChild.nativeElement);
  }
}

2.1.2 获取DOM里面嵌入视图

       咱们可以简单的吧 ng-template的内容认为是嵌入视图。

import {AfterViewInit, Component, QueryList, TemplateRef, ViewChild, ViewChildren} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <ng-template #domTemplate>
      <div>默认我是不会显示的</div>
    </ng-template>
    <ng-template>
      <div></div>
    </ng-template>
  `,
  styleUrls: ['./app.component.less']
})
export class AppComponent implements AfterViewInit {
  /**** DOM节点对应的 ****/
  @ViewChild('domTemplate') domTemplate: TemplateRef<any>; // 查找嵌入元素
  /**** @ViewChild(TemplateRef) @ViewChildren(TemplateRef)获取页面上的ng-template节点信息 ****/
  @ViewChild(TemplateRef) template: TemplateRef<any>;
  @ViewChildren(TemplateRef) templateList: QueryList<TemplateRef<any>>;

  ngAfterViewInit(): void {
    // DOM节点
    console.log(this.domTemplate);
    console.log(this.template);
    if (this.templateList != null && this.templateList.length !== 0) {
      this.templateList.forEach(elementRef => console.log(elementRef));
    }
  }
}

2.2 组件

       大部分情况下第三方库里面的组件或者我们自定义的一些组件在父组件里面都是需要拿到这个子组件对象的。有两种获取获取到组件:一个是通过模板变量名、另一个是通过组件类。

import {AfterViewInit, Component, ElementRef, QueryList, ViewChild, ViewChildren} from '@angular/core';
import {ChildComponent} from './child.component';

@Component({
  selector: 'app-root',
  template: `
    <!-- view child for Component -->
    <app-child #appChild></app-child>
    <app-child></app-child>
  `,
  styleUrls: ['./app.component.less']
})
export class AppComponent implements AfterViewInit {
  /**** 组件 ****/
  @ViewChild('appChild') componentChild: ChildComponent; // 通过模板变量名获取
  @ViewChild(ChildComponent) componentChildByType: ChildComponent; // 直接通过组件类型获取
  @ViewChild('appChild', {read: ElementRef}) componentChildElement: ElementRef; // 直接找到子组件对应的DOM
  @ViewChildren(ChildComponent) componentChildList: QueryList<ChildComponent>; // 获取所有的

  ngAfterViewInit(): void {
    // DOM节点
    console.log(this.componentChild);
    if (this.componentChildList != null && this.componentChildList.length !== 0) {
      this.componentChildList.forEach(elementRef => console.log(elementRef));
    }
  }
}

       有写场景我可能需要直接获取到组件对应的DOM节点,这个时候
@ViewChild、@ViewChildren就的加上过滤条件{read: ElementRef}。如下所示:

  @ViewChild('appChild', {read: ElementRef}) componentChildElement: ElementRef; // 直接找到子组件对应的DOM

2.3 指令

       @ViewChild、@ViewChildren也是可以获取到指令对象的。指令对象的获取和组件对象的获取差不多,唯一不同的地方就是用模板变量名获取指令的时候要做一些特殊的处理。我们还是用具体的实例来说明。

       我们自定义一个非常简单的指令TestDirective,添加exportAs属性。代码如下。

exportAs属性很关键

import {Directive, ElementRef} from '@angular/core';

/**
 * 指令,测试使用,这里使用了exportAs,就是为了方便我们精确的找到指令
 */
@Directive({
  selector: '[appTestDirective]',
  exportAs: 'appTest'
})
export class TestDirective {

  constructor(private elementRef: ElementRef) {
    elementRef.nativeElement.value = '我添加了指令';
  }

}

       获取TestDirective指令,注意单个指令对象获取的时候,模板变量名的写法。比如下面的代码中#divTestDirective='appTest',模板变量名等号右边的就是TestDirective指令exportAs对应的名字。

import {AfterViewInit, Component, QueryList, ViewChild, ViewChildren} from '@angular/core';
import {TestDirective} from './test.directive';

@Component({
  selector: 'app-root',
  template: `
    <!-- view child for Directive -->
    <input appTestDirective/>
    <br/>
    <input appTestDirective #divTestDirective='appTest'/>
  `,
  styleUrls: ['./app.component.less']
})
export class AppComponent implements AfterViewInit {
  /**
   * 获取html里面所有的TestDirective
   */
  @ViewChildren(TestDirective) testDirectiveList: QueryList<TestDirective>;
  /**
   * 获取模板变量名为divTestDirective的TestDirective的指令,这个得配合指令的exportAs使用
   */
  @ViewChild('divTestDirective') testDirective: TestDirective;

  ngAfterViewInit(): void {
    console.log(this.testDirective);
    if (this.testDirectiveList != null && this.testDirectiveList.length !== 0) {
      this.testDirectiveList.forEach(elementRef => console.log(elementRef));
    }
  }
}


       实例链接地址

       总结:@ViewChild、@ViewChildren获取子元素的的时候,我们用的最多的应该就是通过模板变量名,或者直接通过class来获取了。还有一个特别要注意的地方就是获取单个指令对象的时候需要配合指令的exportAs属性使用,并且把他赋值给模板变量名。

FPGA实战:MIG IP核AXI接口DDR3读写优化指南 本文详细解析了FPGA中MIG IP核AXI接口的DDR3读写优化策略,涵盖关键参数配置、突发传输技巧及时序收敛方案。通过AXI接口优化和突发长度选择,可实现高达12.8GB/s的理论带宽,提升DDR3访问效率。文章还提供了Vivado配置实例和调试技巧,助力开发者解决FPGA内存控制中的实际问题。 阅读详情

相关推荐

Exposure Fusion

MertensTMO原理详解: 文章:2007年Exposure Fusion 论文链接:http://ntp-0.cs.ucl.ac.uk/staff/j.kautz/publications/exposure_fusion.pdf 论文代码:C版本:https://github.com/JawThrow/ExposureFusion python版本:https://github.com/lzocro/Exposure-Fusion matlab版本:https://github.com/Mericam

大长腿不解释 1652

angular知识点--@ViewChild详解

ViewChild可以获取到当前组件视图中的单个元素@ViewChildren获取子组件对象列表。

奇怪的人类 1万+

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 288

浅谈Angular中@ViewChild的用法

@ViewChild

IMSI的博客 3577

保姆级教程:用CH34xSerCfg工具修改USB转串口芯片的VID/PID,避免驱动冲突

本文详细介绍了如何使用CH34xSerCfg工具修改USB转串口芯片的VID/PID,解决驱动冲突问题。通过实战案例和配置技巧,帮助开发者高效管理嵌入式设备,避免常见的USB设备识别问题,提升开发效率。

weixin_30924239的博客 224

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

Angular 正确使用 @ViewChild、@ViewChildren 访问 DOM、组件、指令

&nbsp; &nbsp; &nbsp; &nbsp;@ViewChild和@ViewChildren是Angular提供给我们的装饰器,用于从模板视图中获取匹配的元素。需要注意的是@ViewChild和@ViewChildren会在父组件钩子方法ngAfterViewInit调用之前赋值。接下来我们来看下@ViewChild、@ViewChildren怎么使用。 一 选择器 &nbsp; &nb...

旧路 1万+

YOLOv11改进 | 主干/Backbone篇 | 华为最新目标检测网络VanillaNet(适配yolov11的N、S、M、L、X)

本文给大家来的改进机制是华为最新VanillaNet网络VanillaNet是一种注重极简主义和效率的神经网络架构。它的设计简单,层数较少,避免了像深度架构和自注意力这样的复杂操作(需要注意的是该网络结构的通道数会被放大,GFLOPs的量会很高)。我将其替换整个YOLOv10的Backbone,在一些大目标和小目标检测上均有涨点,效果比上一篇RepViT的效果要好。

Snu77的博客 2587

[Angular] 笔记 21:@ViewChild

chatgpt:在 Angular 中,@ViewChild是一个装饰器,用于在组件类中获取对模板中子元素、指令或组件的引用。它允许你在组件类中访问模板中的特定元素,以便可以直接操作或与其交互。例如,如果你在模板中有一个子组件或一个具有本地引用的元素,你可以使用@ViewChild装饰器在组件类中获取对该元素的引用。这样,你就可以在组件类中调用该元素的方法、访问其属性或者订阅其事件。这是一个简单的示例,演示了如何在 Angular 组件中使用@ViewChild在这个例子中,@ViewChild。

学习笔记 1301

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 633

2025实战|C#上位机+STM32实现LED串灯控制:串口通信+PWM调光+自定义帧协议(附上下位机源码)

粘包:一次收到“BRIGHT:50LED_OFF”,解析完全错乱;乱码:串口波特率/编码不匹配,指令变成“??H??50”;丢帧:数据传输中少字符,比如“BRIGHT:5”,解析出亮度5而非50。因此我们设计字节级自定义帧协议协议先行:无论简单还是复杂场景,先定义清晰的帧协议,避免数据错乱;串口稳字当头:下位机用环形缓冲区接收,上位机加锁发送,避免丢包/粘包;跨线程必处理:C#上位机所有UI更新必须用Invoke,否则必崩溃;硬件是基础:接线、供电、共地这些细节,比代码更易出问题;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 756

Angular ViewChild ViewChildren

在任何js框架下,获取元素都是常用且重要的操作。这一节,我们将介绍Angular中如何使用ViewChild来获取DOM元素、组件、指令。(原文阅读) 在这之前,我们需要先了解一个Angular的生命周期函数AfterViewInit AfterViewInit 定义:一个生命周期钩子,会在 Angular 完全初始化了组件的视图后调用。 在组件中注入这个钩子函数后,就必须实现它的方法ngAfterViewInit()。(不用担心,编辑器会提示你的) ngAfterViewInit() 一个回调方法,它.

yanyi24的博客 1187

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3482

Angular 8 使用 @ViewChild、@ViewChildren 访问 DOM、组件、指令

Angular 8 使用 @ViewChild、@ViewChildren 访问 DOM、组件、指令概述一、选择器1.1、任何带有 @Component 或 @Directive 装饰器的类1.2、字符串形式的模板引用变量1.3、组件树中任何当前组件的子组件所定义的提供商(provider)1.4、任何通过字符串令牌定义的提供商1.5、TemplateRef二、适用场景2.1、DOM2.1.1、获取DOM里面宿主视图2.1.2、获取DOM里面嵌入视图2.2、组件2.3、指令 概述 用于配置一个视图查询。

lvxinaidou的博客 2050

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

angular中@ViewChild、@ViewChildren的使用

获取DOM节点 1、在html中给DOM节点起名字 <div #myBox> 我是一个div </div> 2、在js中引入ViewChild import { Component, OnInit , ViewChild } from '@angular/core'; 3、通过ViewChild装饰器获取DOM节点 @ViewChild('myBox') myBox...

weixin_39150852的博客 3378

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

angular @viewchild/childen访问DOM、组件和指令

文章目录1 背景2 基本用法3 使用场景 1 背景 使用公司前端组件库时,用到了@viewchild,一脸懵逼,场景就是通过模板引用变量获取了对应的模板实例及其对应的ts实例。经过学习,发现,@ViewChild和@ViewChildren是Angular提供给我们的装饰器,用于从模板视图中获取匹配的元素。获取模板元素的操作是在在父组件钩子方法ngAfterViewInit调用之前进行的。 2 基...

jeason_chan_zju的博客 372

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Angular使用总结 --- 如何正确的操作DOM

原文出处:https://www.cnblogs.com/shapeY/p/9272961.html 无奈接手了一个旧项目,上一个老哥在Angular项目中大量使用了JQuery来操作DOM,真的是太不讲究了。那么如何优雅的使用Angular的方式来操作DOM呢? 获取元素   1、ElementRef  ---   A wrapper around a native element ins...

chelen_jak的专栏 758

ionic5/angular11使用angular的@ViewChild获取DOM(@ViewChildren获取DOM数组)并使用Renderer2操作DOM

一、编写HTML和CSS。 <ion-header [translucent]="true"> <ion-toolbar> <ion-title> 分类 </ion-title> </ion-toolbar> </ion-header> <ion-content class="content" > <div class="content_1" > <!

weixin_44341110的博客 985

【angular学习】 @ViewChild @ViewChildren Renderer2 模板在组件类中的使用

@ViewChild 获取的是单个模板元素,类型是ElementRef @ViewChild 获取组件在最下面有介绍 在ngOninit()中打印@ViewChild或@ViewChildren,有时能打印出来,有时候打印不出来,所以操作dom的时候在ngAfterViewInit()方法里@ViewChildren 获取的是多个模板元素,类型是QueryList.........

qq_36557846的博客 512

Angular - 笔记

angular

JUN_7777的博客 1712

angular8 模板在组件类中的引用

<div #helloDiv>你好</div> export class AppComponent { @ViewChild('helloDiv') helloDivRef : ElementRef; } ngOnInit() { console.log("初始化",this.helloDivRef ) this.helloDivRef .n...

Null_Bugs的博客 771

angular dom_Angular 8 DOM查询:ViewChild和ViewChildren示例

angular domThe @ViewChild and @ViewChildren decorators in Angular provide a way to access and manipulate DOM elements, directives and components. In this tutorial, we'll see an Angular 8 example of ho...

cumi7754的博客 288

angular2的ElementRef在组件中获取不到

angular2的ElementRef在组件中获取不到 angular2不推荐操作dom,但是实际应用中不可避免的需要使用到dom操作,怎么操作,官方文档提供了一系列api(ElementRef,ViewContainerRef ,TemplateRef)配合 @ViewChild或@V...

chenzhi73455的专栏 381

Angular ViewChild本质:视图引用契约而非DOM查询

ViewChild是Angular中建立父子组件或指令间类型安全引用的核心机制,其原理基于编译时静态分析与运行时视图树绑定,而非动态DOM查找。它承载着明确的生命周期语义(如仅在ngAfterViewInit后可用)和技术价值:保障类型安全、支持接口抽象、解耦实现细节。典型应用场景包括子组件方法调用、指令配置注入、第三方库集成(如Chart.js),以及在OnPush策略下协调变更检测。理解其作为‘视图层引用契约’的本质,可避免undefined错误、时机错配和XSS风险等常见陷阱。

SAN_YUN的专栏 817

如何在组件模板中选择元素?

Does anybody know how to get hold of an element defined in a component template? 有人知道如何掌握组件模板中定义的元素

asdfgh0077的博客 465

【讲人话】Angular如何通过@ViewChildren获取实时渲染的动态DOM节点元素(@ViewChild只能获取静态的固定DOM节点)

故事背景:有一天,强哥整了个动态渲染的列表代码如下 app.component.html <ul> <li *ngFor="let item of items" #input> <input type="text" [value]="item"> </li> </ul> app.component.ts items = [1, 2, 3, 4, 5, 6]; 但是我要渲染6个input,如果.

我驾驶汽车从不是为了从A点到达B点,我喜欢去感受汽车,与之交流,与之融为一体。 2316
上一篇: Angular开发学习笔记:Angular父子组件之间的传值
下一篇: C#开发学习笔记:GridView设置数据相同的列合并
JustWantToFly
博客等级 码龄10年 42粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值