【发布时间】:2019-04-09 14:12:46
【问题描述】:
我有一个组件正在利用 View Change 订阅来监视表单复选框中的更改。当复选框更改为 true 时,子组件的表单将设置为禁用,当复选框为 false 时启用。每次在选中复选框时尝试调用 View Child 函数时,都会返回以下错误: 错误类型错误:无法读取未定义的属性“enableForm”。
我在这里找到的讨论此问题的帖子似乎指向子组件被 ngIf 隐藏,但在我的实例中并非如此。
我已经在控制台记录了各种 Angular 生命周期事件、NgOnInit、NgAfterViewInit、createForm() 等,它们都会在表单初始化时返回。我还可以将一个值传递到子组件中,该值将禁用 Init 上的子表单字段,以便该部分正常工作。但我无法让 View Child 通过同一个组件实例工作。
在这里我初始化我的 View Child:
@ViewChild('effectiveDateComponent') effectiveDateComponent: any;
在这里,我正在侦听复选框中的表单更改(称为“futureDelete”:
this.editForm.get('futureDelete').valueChanges.subscribe(val => {
if (val === false) {
this.effectiveDateComponent.disableForm();
this.deleteButtonDisableFlag = false;
}
if (val === true) {
this.effectiveDateComponent.enableForm();
this.deleteButtonDisableFlag = true;
this.editForm.controls.dateSearch.get('date').valueChanges.subscribe(val => {
if (val) {
this.deleteButtonDisableFlag = false;
}
if (!val) {
this.deleteButtonDisableFlag = true;
}
});
}
});
这是我的 HTML 组件调用:
<app-datetimepicker #effectiveDateComponent [disabled]="true" [dateField]="'effectiveDate'" (dateEmit)="receiveDateEmit($event)" [placeholder]="'yyyy-mm-dd'">Effective Date</app-datetimepicker>
我希望调用函数 disableForm() 或 enableForm(),但我收到以下错误:ERROR TypeError: Cannot read property 'enableForm' of undefined.
【问题讨论】:
-
子组件初始化后能否尝试调用此方法..即可以在 ngAfterViewInit() 中调用它?
-
我认为我在孩子初始化后调用它。我已经在各种生命周期钩子上设置了控制台日志,它们都在触发。
-
尝试在 settimeout 函数中调用你的函数? setTimeout(() => yourfunction(),1000)
-
我已经尝试过了,但我仍然抛出了同样的错误。
-
嗯好吧!!..作为一种解决方法,您可以做的是,在父组件中有一个变量,该变量可以在您的函数中设置,该函数订阅复选框的 valuechanges。这个变量可以设置为子组件的输入,在子组件中,您需要在输入变量上订阅 ngOnChanges 以查看变量是否已更改,然后使用它来启用和禁用表单。类似这样:stackoverflow.com/questions/44702370/…
标签: angular typescript