看一下这个例子:
它不起作用。
但如果我将providers
从@NgModule
移到HelloComponent
,它确实有效。为什么?不应该在@NgModule
级别或@Component
级别提供相同的内容吗?
答案 0 :(得分:2)
因为NG_VALUE_ACCESSOR
绑定到组件的:host
并且链接到方法(ControlValueAccessor方法)。您的模块没有任何这些表单方法(如writeValue,registerOnTouched等)。你的表单元素。因此,在组件级别提供将该特定元素绑定。此外,提供如此深层次意味着每个表单控件都有自己的控件值访问器而不是共享控件。
Angular Form控件及其API与DOM表单控件不同。角度的作用是与dom元素的输入/输出相关联,并为您提供结果。现在,使用自定义控件,您必须在那里提供相同的绑定。通过实施ControlValueAccessor
并提供NG_VALUE_ACCESSOR
,您可以告诉Angular的Forms API如何从/向您的自定义表单控件读取和写入值。
查看source。