ControlValueAccessor とは何ですか?なぜ使用する必要があるのですか?次の記事では、Angular の ControlValueAccessor コンポーネント インターフェイスについて紹介します。
簡単に言えば、ControlValueAccessor は、Angular の FormControl インスタンスとネイティブ DOM 要素の間のブリッジを作成するために使用されるインターフェイスです。その使用法は OnInit に似ており、プログラマはカスタム コンポーネントに対応するメソッドを実装する必要があります。
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Component({ selector: 'custom', templateUrl: './custom.component.html', styleUrls: ['./custom.component.less'], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CustomComponent), multi: true } ] }) export class CustomComponent implements ControlValueAccessor, OnInit, {…
カスタム フォーム要素を作成し、それが Angular の要素で動作することを期待する必要がある場合があります。フォームコントロール通信。現時点では、この目的を達成するには ControlValueAccessor が必要です。
例:
this.myForm = new FormGroup({ userName: new FormControl({value: '', disabled: false}) });
ControlValueAccessor の使用方法は、Angular 公式 Web サイトで紹介されており、たくさんの記事がありますが、具体的にはどのように機能するのでしょうか?
Angular には、ネイティブ/カスタム フォーム コントロールと formControl ディレクティブをブリッジするための共通メカニズムが必要であり、これはまさに ControlValueAccessor が行うことです。このオブジェクトは、ネイティブ フォーム コントロールと formControl ディレクティブを橋渡しし、それらの値を同期します。 ControlValueAccessor インターフェイスを実装し、それを NG_VALUE_ACCESSOR として登録することにより、任意のコンポーネントまたはディレクティブを ControlValueAccessor タイプのオブジェクトに変換できます。
実際には、ネイティブ フォーム コントロールにも ControlValueAccessor に似たインターフェイスがあります。たとえば、Angular がコンポーネント テンプレートで入力またはテキストエリア DOM ネイティブ コントロールに遭遇すると、DefaultValueAccessor ディレクティブが使用されます
#アクセサ |
##フォーム要素 |
##input,textarea |
| #CheckboxControlValueAccessor
input[type=checkbox] |
#NumberValueAccessor |
input[type=number] |
##RadioControlValueAccessor |
##RangeValueAccessor | |
#select |
|
SelectMultipleControlValueAccessor |
select[multiple] |
以上是Angular 为所有原生 DOM 表单元素创建的 Angular 表单控件,即内置ControlValueAccessor ControlValueAccessor 接口定义了四个方法:
formControl 指令使用 writeValue 方法设置原生表单控件的值;使用 registerOnChange 方法来注册由每次原生表单控件值更新时触发的回调函数,我们需要把更新的值传给这个回调函数,这样对应的 Angular 表单控件值也会更新;使用 registerOnTouched 方法来注册用户和控件交互时触发的回调。 formControl会调用名为setUpControl的函数,ControlValueAccessor的实例valueAccessor会被作为参数传入这个函数中。在setUpControl中,ControlValueAccessor的四个方法会在交互时被调用,以完成formControl和元素之间的通信。 拓展:在使用ControlValueAccessor时需要一同引入NG_VALUE_ACCESSOR,它是使用InjectionToken 创建的可在 Provider 中使用的 Token。我们在编写自己的项目时一般不需要用到InjectionToken,但是在一个框架或者第三方的插件中,它就变得十分有必要了。 export const NG_VALUE_ACCESSOR = new InjectionToken<readonlyarray>>('NgValueAccessor');</readonlyarray> ログイン後にコピー 试想当我使用依赖注入的功能时,我需要将我创建的依赖注册进组件中。这时我就需要一个令牌,如果我使用一个字符串作为令牌就有可能会造成重复,相同的令牌会导致后面的覆盖前面的。所以需要一个Token作为一个唯一值来防止这种冲突。 providers: [{ provide: TOKEN, useValue: … }] ログイン後にコピー 更多编程相关知识,请访问:编程视频!! |
以上がAngular学習のControlValueAccessorインターフェースの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。