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>