为什么我需要在组件级别提供 NG_VALUE_ACCESSOR?

Why do I need to provide NG_VALUE_ACCESSOR at the component level?

看看这个例子:

https://stackblitz.com/edit/angular-nxjeu3

没用。

但是如果我将 providers@NgModule 移动到 HelloComponent,它确实有效。为什么? @NgModule 级别或 @Component 级别的提供不应该相同吗?

因为 NG_VALUE_ACCESSOR 将事物绑定到组件的 :host 并链接到那里的方法(ControlValueAccessor 方法)。您的模块没有任何这些表单方法(如 writeValue、registerOnTouched 等)。您的表单元素可以。因此,在组件级别提供将 this 绑定到该特定元素。此外,提供如此深入意味着每个表单控件都有自己的控件值访问器,而不是共享的。

Angular 窗体控件和它的API 是不一样的DOM 窗体控件。 angular 所做的是绑定到 dom 元素的 inputs/outputs 并为您提供结果。现在,对于您的自定义控件,您必须在那里提供相同的绑定。通过实施 ControlValueAccessor 并提供 NG_VALUE_ACCESSOR,您告诉 Angular 的表单 API 它如何读取和写入值 from/to 您的自定义表单控件。

看看source