如何使用angular 4从Parent获取子DOM元素引用

Jey*_*ani 5 angular-components angular

我需要使用angular 4从父组件获取子组件DOM引用,但我无法访问子组件DOM,请指导我如何实现这一点.

parent.component.html

<child-component></child-component>
Run Code Online (Sandbox Code Playgroud)

parent.component.ts

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

@Component({
  selector: 'parent-component',
  templateUrl: './parent.component.html'
})
export class ParentComponent implements AfterViewInit {
  @ViewChild('tableBody') tableBody: ElementRef;
  constructor(){
    console.log(this.tableBody);//undefined
  }
  ngAfterViewInit() {
       console.log(this.tableBody);//undefined
   }
}
Run Code Online (Sandbox Code Playgroud)

child.component.ts

import { Component } from '@angular/core';
@Component({
  selector: 'child-component',
  templateUrl: './child.component.html'
})
export class ChildComponent { 
}
Run Code Online (Sandbox Code Playgroud)

child.component.html

<div>
        <table border="1">
      <th>Name</th>
      <th>Age</th>
      <tbody #tableBody>
        <tr>
         <td>ABCD</td>
          <td>12</td>
        </tr>        
      </tbody>
        </table>
</div> 
Run Code Online (Sandbox Code Playgroud)

pen*_*han 8

扩展Sachila Ranawaka答案:

首先你需要 <child-component #childComp></child-component>

在您的父组件中,而不是ElementRef它应该是ChildComponent:

@Component({
  selector: 'parent-component',
  templateUrl: './parent.component.html'
})
export class ParentComponent implements AfterViewInit {
  @ViewChild('childComp') childComp: ChildComponent;
  constructor(){
  }
  ngAfterViewInit() {
    console.log(this.childComp.tableBody);
  }
}
Run Code Online (Sandbox Code Playgroud)

对于您的孩子组件:

@Component({
  selector: 'child-component',
  templateUrl: './child.component.html'
})
export class ChildComponent { 
  @ViewChild('tableBody') tableBody: ElementRef;
}
Run Code Online (Sandbox Code Playgroud)


one*_*ena 5

除了 Sachila 和 penleychan 的好答案之外,您可以@ViewChild仅通过组件的名称来引用组件:

父组件.html

<!-- You don't need to template reference variable on component -->   
<child-component></child-component> 
Run Code Online (Sandbox Code Playgroud)

然后在 parent.component.ts

import { ChildComponent } from './child-component-path';

@Component({
  selector: 'parent-component',
  templateUrl: './parent.component.html'
})
export class ParentComponent implements AfterViewInit {
  @ViewChild(ChildComponent) childComp: ChildComponent;
  constructor(){
  }
  ngAfterViewInit() {
    console.log(this.childComp.tableBody);
  }
}
Run Code Online (Sandbox Code Playgroud)