Angular 角度自定义窗体控件-获取默认值

Angular 角度自定义窗体控件-获取默认值,angular,Angular,我有一个自定义控件,它使用“ControlValueAccessor”-“registerOnChange”回调在窗体控件的值更改时将值发送到父窗体。没问题 但我还想发送在OnInit期间为自定义控件设置的默认值。问题是“registerOnChange”回调仅在OnInit之后发生 有办法吗?ngAfterViewInit()将在运行registerChange方法后调用 您可以通过编程在此处设置输入值,但这不会调用已注册的onChange()方法(假设名称为onChange)。您需要显式地调

我有一个自定义控件,它使用“ControlValueAccessor”-“registerOnChange”回调在窗体控件的值更改时将值发送到父窗体。没问题

但我还想发送在OnInit期间为自定义控件设置的默认值。问题是“registerOnChange”回调仅在OnInit之后发生

有办法吗?

ngAfterViewInit()
将在运行
registerChange
方法后调用

您可以通过编程在此处设置输入值,但这不会调用已注册的
onChange()
方法(假设名称为onChange)。您需要显式地调用它。现在问题来自“ExpressionChangedTerithasBeenCheckedError”

问题是,如果父组件中存在到子控件的绑定,那么检查也可能发生在父组件中。调用
detectchanges()
只会检查当前组件及其子组件中的更改。执行
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">
ngAfterViewInit(){
设置超时(()=>{
this.value=“更改的值”;
this.onChange(this.value)
})
}
请参见此处的示例:


但再说一遍,你为什么要这么做?在初始化被动表单时,您始终可以给出初始表单控制值。

在设置表单时,您已经有了默认值。为什么你不能用它?添加的答案不能解决你的问题吗?谢谢。我正在按照您的建议使用setTimeout处理它。我需要它,因为我的自定义控件本身就有一个值,即使没有initialised@Muthukumar知道了!谢谢你接受答案!:)