我有一个自定义控件,该控件使用“ ControlValueAccessor”-“ registerOnChange”回调在表单控件的值更改时将值发送到父表单。没问题。
但是我也想发送在OnInit期间为自定义控件设置的默认值。问题是“ registerOnChange”回调仅在OnInit之后发生。
有办法吗?
答案 0 :(得分:1)
ngAfterViewInit()
将在registerOnChange
方法运行后被调用。
您可以在此处以编程方式设置输入的值,但不会调用已注册的onChange()
方法(例如,名称为onChange)。您将需要显式调用它。现在问题出在“ ExpressionChangedAfterItHasBeenCheckedError”。
问题在于,如果那里的子控件有绑定,检查也会在父组件中进行。调用detectCahnges()
仅会检查当前组件及其子组件中的更改。进行markForCheck()
会将其及其祖先标记为下一次更改检测签入,但不会立即调用更改检测。如果没有帮助,肯定会setTimeout()
。
您可以拥有类似的内容:
ngAfterViewInit() {
setTimeout(() => {
this.value = "changed value";
this.onChange(this.value)
})
}
<input
[value]="value"
(input)="onChange($event.target.value)"
(blur)="onTouched()"
[disabled]="isDisabled"
type="text">
在此处查看示例:https://stackblitz.com/edit/controlvalueaccessorgeneric-srsut9?file=src/app/app.component.ts
但是,又一次为什么要这样做呢?初始化响应式表单时,始终可以提供初始表单控制值。