Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)

Stella981
• 阅读 1021

原文链接

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 支持的参数包括 directivecomponent 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 对象

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)

@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));
  }
}

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)

需要注意的是:如果使用了 *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);
  }
}

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)

read 参数

ElementRef

如果不想获取子组件的实例,只想访问Dom元素,可以添加read参数

// home.component.ts
@ViewChild('alert1', {read: ElementRef}) alerts: any;

@ViewChildren也支持read 参数。

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)

ViewContainerRef

You need this token when you need to create templates or components dynamically。当需要动态创建组件时,需要这个参数。

  @ViewChildren(AlertComponent, {read: ViewContainerRef}) alerts: QueryList<AlertComponent>;

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)

点赞
收藏
评论区
推荐文章
Chase620 Chase620
3年前
vue的8种通信方式
1.props/emit1.父组件向子组件传值下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件section.vue中的数据articles:\'红楼梦','西游记','三国演义'\//section父组件<template<divclass"section"
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Souleigh ✨ Souleigh ✨
4年前
React 组件间通信的10种方法
组件间通信方式总结父组件子组件:1.Props2.InstanceMethods子组件父组件:1.CallbackFunctions2.EventBubbling兄弟组件之间:1.ParentComponent不太相关的组件之间:1.Context2.Portals3.Global
爱丽丝13 爱丽丝13
3年前
React 组件通信之发布订阅模式
React通信react的数据流是单向的,react通信有以下几种方式:父向子通信:传入props子向父通信:父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值父向孙通信:利用context传值。React.createContext()兄弟间通信:​1、找一个相同的父组件,既可以用pr
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
Flutter子组件调用父组件方法修改父组件参数
子组件调用父级组件方法的主要实现是父组件给子组件传入一个方法,然后在子组件中调用父级方法来修改父级的参数。看一下效果图!(https://img2018.cnblogs.com/blog/1038765/201907/103876520190702152130487420290106.gif)父级组件实现在父级组件中写一个
Stella981 Stella981
3年前
GcExcel:比 Apache POI 速度更快、性能更高
GrapeCityDocumentsforExcel(GcExcel)是一款服务端JavaExcel组件,产品架构轻量灵活,无需Office组件依赖,结合 纯前端表格控件SpreadJS(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.grapecity.co
Stella981 Stella981
3年前
Kafka设计解析(十八)Kafka与Flink集成
转载自 huxihx(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fhuxi2b),原文链接 Kafka与Flink集成(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fww
Stella981 Stella981
3年前
Essential Studio for UWP发布2017 v2,新增甘特图控件
EssentialStudioforUWP(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.evget.com%2Fproduct%2F3894)是包含有35组件的综合套包,包括最快的图表和网格组件。所有组件根据当前被呈现的设备系列自适应渲染。EssentialStu
Stella981 Stella981
3年前
ReactJS 关键知识点汇总
1.React组件之间事件调用(父组件调用子组件)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fchenyongtu110%2Farticle%2Fdetails%2F49613967)2.ReactJS学习笔记(三)父子组