我知道之前已经问过这个问题,但所选择的答案都不适用于我。
我正在尝试使用@ViewChild从dom中获取ng-select。并且它总是返回未定义的
这是main.html里面的选择
<ng-select id="user-select"
#userSelect
[allowClear]="true"
[items]="singleSignOnUsers"
[disabled]="disabled"
placeholder="No user selected">
</ng-select>
这是我的组件
import { Component, AfterViewInit, ViewChild } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'app-main',
templateUrl: '../app/main.html',
providers: [ApiHttpService, UserAdministrationService]
})
export class AppComponent {
@ViewChild('userSelect') userSelect;
ngAfterViewInit() {
alert(this.userSelect);
}
}
我在这里缺少什么?
更新:哦,我的灵魂! 我想出了为什么这应该没有工作的时候...... 我将整个视图包含在带有ngSwitch的div中。如果我把它移出......我可以访问它们。现在我不知道如何在ngSwitch中访问它们。但我不必使用ngSwitch
<div [ngSwitch]='loading'>
<div *ngSwitchCase="false">
...
<ng-select id="user-select"
#userSelect
[allowClear]="true"
[items]="singleSignOnUsers"
[disabled]="disabled"
placeholder="No city selected">
</ng-select>
...
</div>
<div
答案 0 :(得分:9)
@twaldron您是否在ngOnInit中使用了一些延迟数据加载?
因为在这种情况下,根据我的经验,将@ViewChild作为ElementRef读取不会产生任何结果
如果你的组件已经解析了数据(比如父项将子数据对象传递给子组件的情况),它应该可以工作(至少对我而言)。
在异步数据加载的情况下,我能够使其工作的方式是使用更改通知
@ViewChildren('userSelect') userSelect: QueryList<ElementRef>;
ngAfterViewInit(): void {
this.userSelect.changes.subscribe(item => {
if (this.userSelect.length) {
alert(this.userSelect.first.nativeElment.outerHTML)
}
})
}
答案 1 :(得分:0)
我替换了所有出现的
*ngIf="flag"
使用
[style.display]="flag ? 'block' : 'none'"
使其在我的情况下始终有效。否则,在我的视图首次加载时不存在的ViewChild
组件可能永远都无法定义。
答案 2 :(得分:0)
就我而言,我遇到了同样的问题。我console.log()
编辑了从子组件中检索到的内容,它给了我“未定义”的信息。
我只刷新页面就解决了。 ctrl
+ shift
+ R
可能会有所帮助。我想这是因为浏览器的缓存导致了此问题。