如何在Angular4中访问Component的nativeElement?

时间:2017-07-27 07:14:51

标签: angular

我有两个组件,一个有属性选择器。子组件是,

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的样式宽度和高度。

3 个答案:

答案 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"
相关问题