Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)
原文链接
Understanding ViewChildren, ContentChildren, and QueryList in Angular
使用场景
有时候,我们想要在父组件中访问它的子组件。在Angular中可以使用ViewChildren ViewChild ContentChildren 来实现对子组件的访问。
假设,我们封装了一个Alert子组件
// alert.component.html
<h1 (click)="alert()">{{type}}</h1>
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'app-alert',
templateUrl: './alert.component.html',
styleUrls: ['./alert.component.scss']
})
export class AlertComponent implements OnInit {
@Input() type = 'success';
constructor() { }
ngOnInit() {
}
alert() {
console.log('alert');
}
}
然后,在HomeComponent 使用它多次
// home.component.html
<app-alert></app-alert>
<app-alert type="info"></app-alert>
<app-alert type="danger"></app-alert>
ViewChildren
使用 @ViewChildren decorator 来获取所有的子组件。@ViewChildren 支持的参数包括 directive 、component type 和 模板变量。
// home.component.js
export class HomeComponent implements OnInit, AfterViewInit {
@ViewChildren(AlertComponent) alerts: QueryList<AlertComponent>;
ngAfterViewInit() {
console.log(this.alerts);
this.alerts.forEach(alertInstance => console.log(alertInstance));
}
}
控制台打印出了3个AlertComponent的instance 对象

当@ViewChildren的参数是 component 或者 directive时,会返回component 或者 directive的实例对象。
当@ViewChildren的参数是模板变量时,会分两种情况。如果模板变量对应的是一个component,则返回实例对象;如果模板变量对应的是一个普通html标签,则返回本地元素的引用 ElementRef。
// home.component.html
<div class="col" #div>
<app-alert #alert1></app-alert>
<app-alert type="info"></app-alert>
<app-alert type="danger"></app-alert>
</div>
// home.component.ts
export class HomeComponent implements OnInit, AfterViewInit {
@ViewChildren('alert1') alerts: QueryList<any>;
@ViewChildren('div') div: QueryList<any>;
ngAfterViewInit() {
console.log(this.div);
this.div.forEach(inst => console.log(inst));
console.log(this.alerts);
this.alerts.forEach(alertInstance => console.log(alertInstance));
}
}

需要注意的是:如果使用了
*ngIf来控制子组件是否显示,只有在子组件显示的时候,才能够获取到子组件。
ViewChild
如果在父组件中只有一个子组件,使用@ViewChild比较合适。
// home.component.ts
export class HomeComponent implements OnInit, AfterViewInit {
@ViewChild('alert1') alerts: any;
@ViewChild('div') div: any;
ngAfterViewInit() {
console.log(this.div);
console.log(this.alerts);
}
}

read 参数
ElementRef
如果不想获取子组件的实例,只想访问Dom元素,可以添加read参数
// home.component.ts
@ViewChild('alert1', {read: ElementRef}) alerts: any;
@ViewChildren也支持read 参数。

ViewContainerRef
You need this token when you need to create templates or components dynamically。当需要动态创建组件时,需要这个参数。
@ViewChildren(AlertComponent, {read: ViewContainerRef}) alerts: QueryList<AlertComponent>;

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)的更多相关文章
- Vee-validate 父组件获取子组件表单校验结果
vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...
- 子组件获取父组件数据 propsDown, 父组件获取子组件数据 eventUp
(一) popsDowm 三种方法获取父组件数据:被动获得(1):主动获取(2). 1.被动获得: 父组件:v-bind: 绑定变量参数和方法参数:子组件:props 接收参数.可以在模板中直接使用也 ...
- vue父组件获取子组件页面的数组 以城市三级联动为例
父组件调用子组件 <Cselect ref="registerAddress"></Cselect> import Cselect from '../../ ...
- 关于Vue中,父组件获取子组件的数据(子组件调用父组件函数)的方法
1. 父组件调用子组件时,在调用处传给子组件一个方法 :on-update="updateData" 2. 子组件在props中,接收这个方法并声明 props: { onUp ...
- React Hook父组件获取子组件的数据/函数
我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用.文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hoo ...
- antd 父组件获取子组件中form表单的值
还是拿代码来讲吧,详情见注释 子组件 import React, { Component } from 'react'; import { Form, Input } from 'antd'; con ...
- vue 的父组件和子组件互相获取数据和方法
父组件主动获取子组件的数据和方法 一.ref(但不能实时更新获取) 1.调用子组件的时候 定义一个ref <child ref="headerChild"></c ...
- vue3 template refs dom的引用、组件的引用、获取子组件的值
介绍 通过 ref() 还可以引用页面上的元素或组件. DOM 的引用 <template> <div> <h3 ref="h3Ref">Tem ...
- vue:父子组件间通信,父组件调用子组件方法进行校验子组件的表单
参考: ElementUI多个子组件表单的校验管理:https://www.jianshu.com/p/541d8b18cf95 Vue 子组件调用父组件方法总结:https://juejin.im/ ...
随机推荐
- mybatis之联表查询
今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springM ...
- Python 正则表达式Ⅲ
re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始https://www.xuanhe.net/不符合正则表达式,则匹配失败,函数返回None:而re.se ...
- maven项目创建3 (依赖版本冲突)
调节原则 1 路径近者优先原则 自己添加一个想要依赖的版本 2第一声明者优先原则 谁排在前面就用谁的 以上两种统称为 调节原则 排除原则 排除自己的不想要的版本 版本锁定 谁能够提供锁定的版本,就用谁 ...
- Confluence 6 插入一个文件到你的页面
文件可以在页面中以缩略图或者链接的方式显示.我们有多种办法能够上传文件,请参考 Upload Files 页面. 你可以控制文件如何在你的页面中显示.文件在页面中显示的可用方法与你的文件类型有关. 插 ...
- Kaplan–Meier estimator & Greenwood formula
The Kaplan–Meier estimator (also known as the product limit estimator) estimates the survival functi ...
- 在Windows QT下使用ZeroMQ
zeroMQ作为一个嵌入式消息队列系统,以其轻便灵活的使用方式,极为适合应用程序分布式通讯处理, 或者是一种有效的代替常规saocket通讯的方法. 1)下载地址:http://zeromq.org/ ...
- MySQL数据库入门———常用基础命令
mysql 连接数据库命令: MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) mysql -h localhost -u root -p ...
- Java 工程师成神之路
基础篇 → 什么是面向对象 面向对象.面向过程 是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象.类.继承.封装.多态等基本概念来进行程序设计.从现实世界 ...
- sklearn.model_selection Part 2: Model validation
1. check_cv() def check_cv(cv=3, y=None, classifier=False): if cv is None: cv = 3 if isinstance(cv, ...
- TCP定时器 之 延迟确认定时器
TCP在收到数据段但是无需马上确认时设定,如果在超时时间之内有数据要发送到对端,则确认会随着数据一起发送,即捎带ACK,如果达到超时时间则执行定时器回调立即发送ack: 启动定时器: 延迟确认定时器调 ...