Angular 7-在初始化子组件后,视图子组件仍然返回为未定义

Angular 7-在初始化子组件后,视图子组件仍然返回为未定义,angular,typescript,Angular,Typescript,我有一个组件正在利用视图更改订阅来监视表单复选框中的更改。当复选框更改为true时,子组件的窗体将设置为disabled,当复选框为false时,子组件的窗体将设置为enabled。每次我尝试在选中复选框时调用View子函数时,都会返回以下错误: 错误类型错误:无法读取未定义的属性“enableForm” 我在这里找到的讨论这个问题的帖子似乎指向ngIf隐藏的子组件,但在我的实例中不是这样 我已经记录了各种角度生命周期事件,NgOnInit、NgAfterViewInit、createForm(

我有一个组件正在利用视图更改订阅来监视表单复选框中的更改。当复选框更改为true时,子组件的窗体将设置为disabled,当复选框为false时,子组件的窗体将设置为enabled。每次我尝试在选中复选框时调用View子函数时,都会返回以下错误: 错误类型错误:无法读取未定义的属性“enableForm”

我在这里找到的讨论这个问题的帖子似乎指向ngIf隐藏的子组件,但在我的实例中不是这样

我已经记录了各种角度生命周期事件,NgOnInit、NgAfterViewInit、createForm()等等,它们都在表单初始化时返回。我还能够将一个值传递到子组件中,该组件将禁用Init上的子表单字段,以便该部分正常工作。但是我不能让视图子对象通过同一个组件实例工作

在这里,我初始化我的视图子对象:

@ViewChild('effectiveDateComponent') effectiveDateComponent: any;
在这里,我正在收听我的复选框(称为“futureDelete”)中的表单更改:

以下是我的HTML组件调用:

<app-datetimepicker #effectiveDateComponent [disabled]="true" [dateField]="'effectiveDate'" (dateEmit)="receiveDateEmit($event)" [placeholder]="'yyyy-mm-dd'">Effective Date</app-datetimepicker>
生效日期

我希望调用函数disableForm()或enableForm(),但我得到以下错误:错误类型错误:无法读取未定义的属性“enableForm”。

您可以按组件引用此属性。如果
组件类是
类AppDatetimepicker
,则可以尝试以下操作:

@ViewChild(AppDatetimepicker) effectiveDateComponent: AppDatetimepicker;

我认为您的代码是在解决
ViewChild
之前执行的,也许您只需要在
enableForm()
disableForm();
方法周围添加
if(this.effectiveDateComponent){}
,您需要将此订阅放在ngAfterViewInit生命周期挂钩中

ngAfterViewInit生命周期挂钩的说明,根据:

Angular初始化组件的视图和子视图后响应 视图/指令所在的视图


作为一种解决方法,您可以在父组件中设置一个变量,该变量可以在您的函数中设置为valuechanges of checkbox。该变量可以设置为子组件的输入,在子组件中,您需要订阅输入变量的ngOnChanges,以查看该变量是否已更改,然后使用它用于启用和禁用表单。与此类似:

返回以下错误:未捕获引用错误:未定义effectiveDateComponent。我认为引号在语法上是必要的?你是对的。我在阅读整个答案之前就发布了。之后我立即更新了,但在更新之前你一定看到了。没问题,我很感激删除帮助。您编辑的代码返回我的原始错误:错误类型错误:无法读取未定义的属性“enableForm”。在初始化子组件后,是否可以尝试调用此方法..例如,可以在ngAfterViewInit()中调用它?我想我是在孩子初始化后调用它的。我已经在各种生命周期挂钩上设置了控制台日志,它们都启动了。试着在settimeout函数内调用你的函数?settimeout(()=>yourfunction(),1000)我已经尝试过了,但仍然抛出了相同的错误。嗯,好吧!!…作为一种解决方法,您可以在父组件中设置一个变量,该变量可以在您的函数中设置,该函数可以订阅valuechanges of checkbox。该变量可以设置为子组件的输入,并且在子组件中您需要订阅ngOnC更改输入变量以查看该变量是否已更改,然后使用它启用和禁用表单。类似于此:感谢您的建议。这会导致跳过整个代码块,我想这证明了您的观点,即视图子项未解决?可能您的模板文件中有一个*ngIf?我的临时文件中有10个迟交的文件,但我非常确定没有任何文件包含讨论中的组件。代码部分在哪里执行:this.editForm.get('futureDelete')。valueChanges?在构造函数中执行?在ngOnInit()方法中执行?在ngOnInit()中调用。
@ViewChild(AppDatetimepicker) effectiveDateComponent: AppDatetimepicker;