我有两个组件,一个有属性选择器。子组件是,
import { Component, OnInit, Input, ElementRef } from '@angular/core';
@Component({
selector: '[app-bar-chart]',
templateUrl: './bar-chart.component.html',
styleUrls: ['./bar-chart.component.css']
})
export class BarChartComponent implements OnInit {
@Input() chartContainer: ElementRef;
@Input() title: string;
@Input() chartData: {
title: string,
content: {
label: string,
value: number,
fill?: string
}[]
}[];
constructor() { }
ngOnInit() {
console.log(this.chartContainer);
console.log(this.chartContainer.nativeElement);
}
}
父组件是,
import { Component, OnInit, Output, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'app-dashboard',
template: `<div><div class="graph-image" style="width: 100%; height: 400px;" app-bar-chart [title]="barChartTitle" [chartData]="ChartData" [chartContainer]="chartContainer" #chartContainer></div></div>`,
styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent implements OnInit {
barChartTitle = 'Transaction History';
ChartData = [
{
"title": "May2017",
"content": [
{
"label": "payable",
"value": 10
}
]
},
{
"title": "Jun2017",
"content": [
{
"label": "payable",
"value": 120
}
]
}
];
constructor() { }
ngOnInit() {
}
}
我将本地引用从父组件传递给子组件。当我安慰这个本地引用的本机元素时,它是'undefined'。如何访问本机元素,以便可以访问组件div的样式宽度和高度。
答案 0 :(得分:29)
如果您需要组件的ElementRef
,则无法使用模板变量。如果元素是一个组件,那么您将获得组件实例。模板变量仅为纯HTML元素返回ElementRef
。
要获取组件的ElementRef
,您需要使用@ViewChild()
@ViewChild('chartContainer', { read: ElementRef }) myChartContainer:ElementRef;
然后将其与
一起传递[chartContainer]="myChartContainer"
我会将输入设为一个setter
private _chartContainer:ElementRef;
@Input()
set chartContainer(value: ElementRef) {
this._chartContainer = value;
console.log(this.chartContainer);
console.log(this.chartContainer.nativeElement);
}
但ngOnInit
也适用Plunker example
答案 1 :(得分:13)
问题在于,如果在Angular视图作为组件的主机元素的元素上定义模板引用,您将获得对组件实例的引用。这里:
<... chartContainer]="chartContainer" #chartContainer></div>
chartContainer
将指向BarChartComponent
的实例,这就是nativeElement
未定义的原因。
要获取主机元素的elementRef
,您不需要任何绑定或生命周期钩子,只需将元素注入构造函数:
export class BarChartComponent implements OnInit {
constructor(element: ElementRef) {
console.log(element.nativeElement);
}
答案 2 :(得分:0)
在第一个选择器中,您设置了'[app-bar-chart]',它应该没有方形brachets。 要传递父级,您应该使用:
[chartContainer]="this"
而不是:
[chartContainer]="chartContainer"