为什么我需要在组件级别提供 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。
看看这个例子:
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。