angular - @ViewChild 在 Angular 组件中未定义,使用 angular2-signaturepad 库
问题描述
我正在开发一个 Angular 项目angular2-signaturepad
。我试图访问模板中的一个组件,所以我创建了一个@ViewChild。但是当我尝试使用它时,它是未定义的。
这是相关的html片段:
<signature-pad [options]="options" (onBeginEvent)="drawBegin()" (onEndEvent)="drawComplete()"></signature-pad>
这是打字稿文件的片段:
@ViewChild(SignaturePad, {static: true}) public signaturePad: SignaturePad;
由于this.signaturepad
未定义,我无法调用我需要的任何函数。谁能帮我这个?
解决方案
这里可能会发生一些事情。
您可能试图在 ViewChild 存在之前访问它。ViewChildren 将在ngAfterViewInit
被调用之前被解析(更多关于生命周期事件的信息在这里),所以你只能保证它是在那个函数中定义的。例如:
export class MyComponent implements AfterViewInit, OnChanges {
@ViewChild(SignaturePad, {static: true}) public signaturePad: SignaturePad;
constructor() {
console.log(this.signaturePad); // always undefined
}
ngOnChanges(changes) {
console.log(this.signaturePad); // sometimes undefined, sometimes defined
}
ngAfterViewInit() {
console.log(this.signaturePad); // defined!
}
可能发生的另一件事是使用static: true
,这意味着 ViewChild 将在更改检测之前解决(有关 ViewChild 的更多信息here)。这意味着,如果<signature-pad>
嵌套在另一个恰好是有条件的元素内,那么 ViewChild 将不会被解析。例如:
<div *ngIf="allowEdit" class="my-container">
<signature-pad ...></signature-pad>
</div>
然后在类中,不会定义 ViewChild
ngAfterViewInit() {
console.log(this.signaturePad); // undefined
}
如果这是您的情况,那么更改{static: true}
为{static: false}
应该解决它
推荐阅读
- python - 将 Django 与 API 之类的调用一起使用时,Django REST 框架的好处?
- json - 如何检查骆驼路线中的jsonpath是否存在密钥?
- html - 如何格式化由 Angular 8 生成的电子邮件的内容
- python - Seaborn 图不显示所有列值
- ssl - 由于 Windows 10 上的 SSL,Julia 中的 conda 安装失败
- jquery - 在另一个克隆中克隆。子克隆仅在父克隆中有效,在父克隆中无效
- android - 为什么按下硬件后退按钮后,我的活动进度条没有显示在我的片段中?
- github - github存储库名称中特殊字符的规则?
- excel - 如何实现从excel到vbnet的LOOKUP功能?
- c++ - 在 Visual Studio 2013 上使用 StingRay Grid 时出错