【发布时间】:2016-10-03 04:59:01
【问题描述】:
我正在尝试了解 ControlValueAccessor 是如何精确工作的。
我用两个不同的控制组件研究了它的行为:
- 第一个假设是提供一个原始值:单个数字。
- 第二个提供了一个复杂的对象。
简而言之:
class FirstControlComponent implements ControlValueAccessor {
// ...
value:number = 10;
writeValue(value: number) {
this.value = value;
}
// ...
}
class SecondControlComponent implements ControlValueAccessor {
// ...
value:any = {};
writeValue(value: any) {
this.value = value;
}
// ...
}
ControlValueAccessor 接口只指定了一个“setter”:writeValue,但没有指定“getter”。
所以当我将控件绑定到 SecondControlComponent 时,类似于:
this.form = this.builder.group({
controlName: this.builder.control(this.theObject) });
在模板的后面:
<second-component ngControl='controlName'> <second-component>
一切正常,因为在 init 上调用 writeValue 并引用现有的 theObject 对象,因此控件修改对象的同一实例(希望我很清楚)
但是:如果我对 FirstControlComponent 执行完全相同的操作,因为该值没有作为引用传递(因为它是一个原始值),并且因为 ControlValueAccessor 不提供“设置器”,我的控件中的值和我的主机组件中的值没有保持同步......
这是否意味着我们必须将 Object 而不是原始的传递给实现 ControlValueAccessor 的自定义控件?我猜不,所以我想我一定是误解了一些东西.. :)
我用对了吗?
欢迎任何提示!
谢谢!
【问题讨论】:
-
控件有一个属性
updateValue()来设置值。 -
我猜 updateValue() 将在绑定的控件组件上调用 writeValue()。但是如果控制组件本身改变了它的值会发生什么?这种变化如何反映到表单中的控件上?
标签: binding angular components controls