angular - Angular 自定义表单控件 - 获取默认值
问题描述
我有一个自定义控件,它使用“ControlValueAccessor”-“registerOnChange”回调在表单控件的值发生变化时将值发送到父表单。这里没问题。
但我也想发送在 OnInit 期间为自定义控件设置的默认值。问题是“registerOnChange”回调仅在 OnInit 之后发生。
有办法吗?
解决方案
ngAfterViewInit()
将在registerOnChange
方法运行后调用。
您可以在此处以编程方式设置输入的值,但这不会调用已注册的onChange()
方法(例如名称为 onChange)。您将需要显式调用它。现在问题来自“ExpressionChangedAfterItHasBeenCheckedError”。
问题是如果那里有与子控件的绑定,则检查也可能发生在父组件中。调用 adetectCahnges()
只会检查当前组件及其子组件的变化。执行 amarkForCheck()
将标记此及其祖先以检查下一次更改检测,但不会立即调用更改检测。如果没有任何帮助,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
但是,为什么你需要这样做?在初始化 Reactive 表单时,您始终可以提供初始表单控件值。
推荐阅读
- math - 缩放旋转椭圆的 X 轴
- visual-studio - 无法使用 Visual Studio Live Share 在客户端启动项目窗口
- python-2.7 - pip install mock 有效,但 import mock 无效
- javascript - 如何通过 esri js 中的 javascript api 访问安全的 webscene(无需向用户询问凭据。)
- python - 当我在 python tkinter 中另存为 pdf 时,它显示错误
- docker - 在构建 VSCode 开发容器时使用主机网络
- powershell - 混合纠缠发现和运行变量
- asp.net-core - 为什么我的 URL 在我按 Enter 之前得到处理?
- mysql - 使用子查询优化 SQL 查询
- php - 无法安装学说/mongodb-odm-bundle