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
}
}
是否要在禁用后访问控件?