Angular 如何使原生元素与其值访问器 API 连接?
How does Angular makes native element connect with its value accessor API?
我正在为项目创建 Web 组件。我想让这些 Web 组件的行为类似于 Angular 中的原生元素:自动地,[(ngModel)]
和/或 [FormControl]
对它们起作用。
我认为这是不可能的,因为我的网络组件触发的事件类型。这些 DOM 事件只接受 detail
字段中的自定义值,而 Angular 只检查 value
字段。所以我将我的网络组件打包成一个 Angular 组件,该组件实现了 ngValueAccessor
API.
但现在我想起来了,像 input
这样的原生元素确实可以与 Angular API 很好地通信,即使它们是原生的,而且我假设它们使用相同的事件类型作为我的网络组件。
怎么会这样?
Angular 对原生元素使用默认 class 实现:https://angular.io/api/forms/ControlValueAccessor#class-implementations
一个input
使用了DefaultValueAccessor。它还有一个 ngDefaultControl
选择器。
This value accessor is used by default for <input type="text">
and <textarea>
elements, but you could also use it for custom components that have similar behavior and do not require special processing. In order to attach the default value accessor to a custom element, add the ngDefaultControl attribute as shown below.
<custom-input-component ngDefaultControl [(ngModel)]="value"></custom-input-component>
我正在为项目创建 Web 组件。我想让这些 Web 组件的行为类似于 Angular 中的原生元素:自动地,[(ngModel)]
和/或 [FormControl]
对它们起作用。
我认为这是不可能的,因为我的网络组件触发的事件类型。这些 DOM 事件只接受 detail
字段中的自定义值,而 Angular 只检查 value
字段。所以我将我的网络组件打包成一个 Angular 组件,该组件实现了 ngValueAccessor
API.
但现在我想起来了,像 input
这样的原生元素确实可以与 Angular API 很好地通信,即使它们是原生的,而且我假设它们使用相同的事件类型作为我的网络组件。
怎么会这样?
Angular 对原生元素使用默认 class 实现:https://angular.io/api/forms/ControlValueAccessor#class-implementations
一个input
使用了DefaultValueAccessor。它还有一个 ngDefaultControl
选择器。
This value accessor is used by default for
<input type="text">
and<textarea>
elements, but you could also use it for custom components that have similar behavior and do not require special processing. In order to attach the default value accessor to a custom element, add the ngDefaultControl attribute as shown below.
<custom-input-component ngDefaultControl [(ngModel)]="value"></custom-input-component>