Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée de l'interface ControlValueAccessor de l'apprentissage angulaire

青灯夜游
Libérer: 2023-03-10 20:03:23
avant
1968 Les gens l'ont consulté

Qu'est-ce que ControlValueAccessor ? Pourquoi devez-vous utiliser ? L'article suivant vous présentera l'interface du composant ControlValueAccessor dans Angular. J'espère qu'il vous sera utile !

Explication détaillée de l'interface ControlValueAccessor de l'apprentissage angulaire

ControlValueAccessor Qu'est-ce que ?

En termes simples, ControlValueAccessor est une interface utilisée pour créer un pont entre l'instance FormControl d'Angular et les éléments natifs du DOM. Son utilisation est similaire à OnInit, obligeant les programmeurs à implémenter les méthodes correspondantes dans les composants personnalisés.

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, {…
Copier après la connexion

Pourquoi devez-vous utiliser ControlValueAccessor

Parfois, vous devrez peut-être créer un élément de formulaire personnalisé et espérer qu'il pourra communiquer avec succès avec FormControl d'Angular. À l’heure actuelle, vous avez besoin de ControlValueAccessor pour atteindre cet objectif.

Par exemple :

this.myForm = new FormGroup({
    userName: new FormControl({value: '', disabled: false})
});
Copier après la connexion
Copier après la connexion
    
             
    
             

Compréhension approfondie de

L'utilisation de ControlValueAccessor a été introduite sur le site officiel d'Angular et dans de nombreux articles, mais comment ça marche spécifiquement ?

Angular a besoin d'un mécanisme commun pour relier les contrôles de formulaire natifs/personnalisés et les directives formControl, et c'est exactement ce que fait ControlValueAccessor. Cet objet relie les contrôles de formulaire natifs et les directives formControl et synchronise leurs valeurs. Tout composant ou directive peut être converti en un objet de type ControlValueAccessor en implémentant l'interface ControlValueAccessor et en l'enregistrant sous NG_VALUE_ACCESSOR.

En fait, les contrôles de formulaire natifs ont également des interfaces similaires à ControlValueAccessor. Par exemple : lorsque Angular rencontre un contrôle natif DOM d'entrée ou de zone de texte dans un modèle de composant, il utilisera la directive DefaultValueAccessor

. select

Accessor

Élément de formulaire

DefaultValueAccessor

entrée, zone de texte

case à cocher ControlValueAccessor

input[type=checkbox]

NumberValueAccessor

input[type=number]

RadioControlValueAccessor

input[type=radio]

Ran geValueAccessor

input[type =range] OnSelectControlValueAccessor

SelectableControlValueAccessor

select [Multiple]

以上是Angular 为所有原生 DOM 表单元素创建的 Angular 表单控件,即内置ControlValueAccessor

ControlValueAccessor 接口定义了四个方法:

  • - writeValue(obj:any):将表单模型中的新值写入视图或DOM属性(如果需要)的方法,它将来自外部的数据写入到内部的数据模型。

  • - registerOnChange(fn:any):一种注册处理程序的方法,当视图中的某些内容发生更改时应调用该处理程序。它具有一个告诉其他表单指令和表单控件以更新其值的函数。通常在 registerOnChange 中需要保存该事件触发函数,在数据改变的时候,可以通过调用事件触发函数通知外部数据变了,同时可以将修改后的数据作为参数传递出去。

  • - registerOnTouched(fn: any):注册 onTouched 事件,基本同 registerOnChange ,只是该函数用于通知表单组件已经处于 touched 状态,改变绑定的 FormControl 的内部状态。

  • - setDisabledState(isDisabled: boolean):当调用 FormControl 变更状态的 API 时得表单状态变为 Disabled 时调用 setDisabledState() 方法,以通知自定义表单组件当前表单的读写状态。

formControl 指令使用 writeValue 方法设置原生表单控件的值;使用 registerOnChange 方法来注册由每次原生表单控件值更新时触发的回调函数,我们需要把更新的值传给这个回调函数,这样对应的 Angular 表单控件值也会更新;使用 registerOnTouched 方法来注册用户和控件交互时触发的回调。

Explication détaillée de linterface ControlValueAccessor de lapprentissage angulaire

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>
Copier après la connexion

试想当我使用依赖注入的功能时,我需要将我创建的依赖注册进组件中。这时我就需要一个令牌,如果我使用一个字符串作为令牌就有可能会造成重复,相同的令牌会导致后面的覆盖前面的。所以需要一个Token作为一个唯一值来防止这种冲突。

providers: [{ provide: TOKEN, useValue: … }]
Copier après la connexion

更多编程相关知识,请访问:编程视频!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!