angular - 模型变异时未调用 Angular ControlValueAccessor writeValue()
问题描述
我正在开发一个 Angular 自定义表单组件,它应该适用于整个对象模型的一部分,而其他标准表单组件适用于同一模型的其他部分。
为此,我ControlValueAccessor
使用此 Thoughtram 博客文章作为模型来实现。
由于某种原因,当相同形式的另一个组件改变模型时,不会调用此组件的 writeValue(),尽管由于某种原因,组件内部的标准控件正在更新。
这个基于 Thoughtram 帖子的 stackblitz 示例说明了这个问题:
CounterInput1Component 接收outerModel.integer
它的 ngModel,并对其进行操作。
CounterInput2Component 接收整个outerModel
,然后对该integer
属性进行操作。
当整数增加时,通过标准输入控件或Counter2
,writeValue()
调用Counter1
.
然而,对于Counter2
,writeValue()
在实例化时被调用(两次),但此后从未被调用,无论是Counter1
从标准输入控件还是从标准输入控件递增。
为什么不writeValue()
为 Counter2 调用?尽管如此,它的内部组件是如何被告知要更新的?
解决方案
这不是您的自定义控件表单的问题,请记住,当您更改对象的属性时,对象不会更改。您需要更改所有对象
例如你的输入像
<input name="standardInput"
[ngModel]="outerModel.integer"
(ngModelChange)="outerModel={integer:$value}" />
或者一个按钮
<button (click)="outerModel={integer:20}">click</button>
声明:writeValue 仅在更改“对象”时发生,并且在任何控件中都会发生。查看在 stackblitz 中使用 formControl 的示例
这是一个简单的formControl,
form=new FormControl(this.data)
ngOnInit()
{
this.form.valueChanges.subscribe(res=>{
this.counter++
console.log(res)
})
}
click()
{
this.data.integer++
}
change()
{
this.data.integer++
this.form.setValue(this.data);
}
<pre>
{{form.value |json}}
Counter changes:{{counter}}
</pre>
<button (click)="click()">click</button>
<button (click)="change()">change</button>
我们可以不考虑,因为组件的外部和内部的对象是相同的,所以属性改变了,你可以看到真正的值,但重复一遍,没有改变
推荐阅读
- dpdk - DEV_TX_OFFLOAD_VXLAN_TNL_TSO 卸载测试 - DPDK
- api - VueJS - 如何在同一组件中的另一个 API 调用中使用一个 API 调用的响应
- java-native-interface - JNI 类和接口命名
- ansible - Ansible with_items 第二个列表作为条件
- c# - OneTimeSetUp:System.ComponentModel.Win32Exception:没有足够的内存资源来处理此命令
- raspberry-pi - 尝试在 Raspberry Pi 集群上设置多语言环境教堂
- c++ - 从类/结构中声明的枚举类型到在该类/结构中也声明的对等静态方法?
- python - 获取附加到Django中每个对象的前N个标签
- vue.js - 在 Nuxt js 项目 axios 自动编码 url
- java - 从具有列表字段的 Java 对象创建 QueryDSL 谓词的问题