无法获取子 DOM 元素
2017-06-01
804
Note: since the problem is a little complex, the code is abstracted for readability
我们有一个这样的
<parent-component>
:
<child-component></child-component>
<button (click)="doSomeClick()"> Do Some Click </button>
<child-component>
的
template
是:
<textarea #childComponentElement #someField="ngModel" name="someName" [(ngModel)]="someModel"></textarea>
我们试图在
parent-component.component.ts
中访问此元素的值,如下所示:
export class ParentComponent implements AfterViewInit {
@ViewChild('childComponentElement') el:ElementRef;
ngAfterViewInit() {
console.log(this.el.nativeElement.value);
}
doSomeClick(){
}
}
但是它抛出了此错误:
Cannot read property 'nativeElement' of undefined
到目前为止我们尝试了什么:
-
这允许访问
<parent-component>
,我们需要<textarea>
的<child-component>
-
这与
angular-tree-component
- 指令名称采用 camelCased
-
ElementRef
似乎是一个旧东西 - 这会抛出 无法读取未定义的属性“nativeElement”
-
this.element.nativeElement
和 之间的引用如何<input>
元素是否已建立? - 没有 *ngIf 或 *ngSwitchCase
-
没有与
#childComponentElement
一起使用的*ngIf
-
调用仅在
ngAfterViewInit
内部 - 超时是一种非常肮脏的方法
2个回答
使用嵌套组件没有简单的方法来实现这一点,您必须创建一个
EventEmitter
,它发出您尝试访问的元素的
ElementRef
:
child.component.ts
class ChildComponent implements AfterViewInit {
@Output()
templateLoaded: EventEmitter<ElementRef> = new EventEmitter()
@ViewChild('childComponentElement') el: ElementRef
ngAfterViewInit(): void {
this.templateLoaded.emit(this.el)
}
}
parent.component.html
<child-component (templateLoaded)="templateLoaded($event)"
parent.component.ts
class ParentComponent {
templateLoaded(template: ElementRef): void {
// do stuff with the `template`
}
}
原始答案
尝试在
ViewChild
的第二个参数中使用
read
属性
@ViewChild('childComponentElement', {read: ElementRef}) el: ElementRef
如果您对第二个参数感到疑惑,这个答案给出了一个很好的解释: @ViewChild 中的 read 参数是什么
borislemke
2017-06-01
使用
@Output
装饰器或服务,而不是绝望地尝试直接从父组件访问文本区域
子模板
<textarea #childComponentElement #someField="ngModel" name="someName" [(ngModel)]="someModel"></textarea>
子组件
@ViewChild('childComponentElement') el:ElementRef;
@Output() textarea = new EventEmitter();
constructor(){
this.textarea.emit(this.el.nativeElement.value);
}
父模板
<child-component (change)="getdata($event)"></child-component>
父组件
export class ParentComponent {
getdata(e) {
console.log(e);
}
}
Hamed Baatour
2017-06-01