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

时间:2019-04-25 07:27:31

标签: angular

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

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

有办法吗?

1 个答案:

答案 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

但是,又一次为什么要这样做呢?初始化响应式表单时,始终可以提供初始表单控制值。