我无法理解为什么ViewChild
在相同的确切代码适用于textarea
元素时返回null,但它不适用于div
模板:
<div #refId class = 'line_counter' >
{{lineNumber}}
</div>
组件:
import {Component, OnInit, Input, ElementRef, ViewChild} from '@angular/core';
import {Globals} from "../../../globals";
@Component({
selector: 'app-line-counter',
templateUrl: './line-counter.component.html',
styleUrls: ['./line-counter.component.css']
})
export class LineCounterComponent implements OnInit {
@ViewChild('#refId') textDiv:ElementRef;
@Input() lineNumber : number = 0;
constructor() {
}
ngOnInit() {
if(Globals.refLineCounter == null) {
Globals.refLineCounter = this;
//console.log(Globals.refLineCounter.getHeight());
console.log(this.getHeight());
}
}
getHeight(){
return this.textDiv.nativeElement.height;
}
}
答案 0 :(得分:7)
代码中的两个错误 - 首先从#
删除ViewChild
,您不需要它:
@ViewChild('refId') textDiv:ElementRef;
其次,ViewChild
变量未在AfterViewInit
生命周期之前初始化,因此您需要将代码从ngOnInit
移至ngAfterViewInit
:
ngAfterViewInit() {
if(Globals.refLineCounter == null) {
Globals.refLineCounter = this;
//console.log(Globals.refLineCounter.getHeight());
console.log(this.getHeight());
}
}
答案 1 :(得分:0)
ngAfterViewInit
事件触发后引用ViewChild(en)。您需要从AfterViewInit
实现接口@angular/core
。@ViewChild
属性中没有哈希值的情况下引用它。另请参阅https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html了解其他生命周期挂钩详细信息。
以下是您的代码中的必要内容(我删除了OnInit
,因为此类组件中似乎不再需要)。
import {Component, Input, ElementRef, ViewChild, AfterViewInit} from '@angular/core';
export class LineCounterComponent implements AfterViewInit {
@ViewChild('refId') textDiv:ElementRef;
ngAfterViewInit() {
if(Globals.refLineCounter == null) {
Globals.refLineCounter = this;
//console.log(Globals.refLineCounter.getHeight());
console.log(this.getHeight());
}
}
}