Angular ngAfterViewInit中的访问表单控件

Angular ngAfterViewInit中的访问表单控件,angular,Angular,我想访问表单控件并有条件地禁用某些控件。在以下代码中,表单没有控件: 组件 export class OfferDialogComponent implements OnInit, AfterViewInit { freemium = false; @ViewChild('editForm') editForm: NgForm; ngAfterViewInit(): void { this.editForm.form.get("trialPeriod"

我想访问表单控件并有条件地禁用某些控件。在以下代码中,表单没有控件:

组件

export class OfferDialogComponent implements OnInit, AfterViewInit {

    freemium = false;
    @ViewChild('editForm') editForm: NgForm;

    ngAfterViewInit(): void {
        this.editForm.form.get("trialPeriod").disable();
    }
}
模板

<form name="editForm" role="form" novalidate (ngSubmit)="save()" #editForm="ngForm">

如何有条件地访问和初始化表单控件?

定义表单控件
在.ts中:-
emailFormControl=新FormControl(“默认值”);
并使用此.emailFormControl.value获取值

见:https://material.angular.io/components/input/examples
来自角度文档

模板驱动的表单将其表单控件的创建委托给 指令。为避免检查错误后发生更改,这些指令 构建整个控制树需要一个以上的周期。这意味着 您必须等到下一个更改检测周期发生后,才能执行此操作 从组件类内操作任何控件

例如,如果将
@ViewChild(NgForm)
ngAfterViewInit
lifecyclehook中查询并检查它,您将 发现它没有子对象。您必须触发更改检测 使用
setTimeout()
循环,然后才能从数据中提取值 控制、测试其有效性或将其设置为新值

修改代码:

ngAfterViewInit(): void {
  setTimeOut(() => {
    this.editForm.form.get('trialPeriod').disable();
  });
}
或者您可以使用
ngAfterViewChecked

import { Component, ViewChild, ChangeDetectorRef } from '@angular/core';
class App {
  constructor(private cdRef: ChangeDetectorRef) {}
  ngAfterViewChecked() {
    if (this.editForm.controls.name) this.editForm.form.get('name').disable();

    this.cdRef.detectChanges(); 
//Forcing change detection to avoid ExpressionChangedAfterItHasBeenCheckedError
  }
}

是否要在禁用后访问控件?