返回顶部
首页 > 资讯 > 精选 >Angular之ControlValueAccessor接口怎么使用
  • 693
分享到

Angular之ControlValueAccessor接口怎么使用

2023-07-05 11:07:13 693人浏览 泡泡鱼
摘要

这篇文章主要讲解了“angular之ControlValueAccessor接口怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular之ControlValueAccessor

这篇文章主要讲解了“angular之ControlValueAccessor接口怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular之ControlValueAccessor接口怎么使用”吧!

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, {…

为什么需要使用 ControlValueAccessor

有时,你可能需要创建自定义的表单元素,并希望它能和Angular的FormControl成功通信。这时你便需要ControlValueAccessor来实现这个目的。

比如:

this.myForm = new FormGroup({    userName: new FormControl({value: '', disabled: false})});
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">    <div class="form-group">        <label>            Name:            <my-input formControlName="userName"></my-input>        </label>    </div>    <div class="form-group">        <button type="submit">Submit</button>    </div></form>

深入理解

ControlValueAccessor的使用方法在Angular官网和很多的文章中都有介绍,但是它具体是如何起作用的呢?

Angular 需要一种通用机制来桥接原生/自定义表单控件和 formControl 指令,而这正是 ControlValueAccessor 干的事情。这个对象桥接原生表单控件和 formControl 指令,并同步两者的值。任何一个组件或指令都可以通过实现 ControlValueAccessor 接口并注册为 NG_VALUE_ACCESSOR,从而转变成 ControlValueAccessor 类型的对象。

其实原生表单控件也拥有类似于ControlValueAccessor的接口,比如:当 Angular 在组件模板中中遇到 input 或 textarea DOM 原生控件时,就会使用DefaultValueAccessor 指令

Accessor

Form Element

DefaultValueAccessor

input,textarea

CheckboxControlValueAccessor

input[type=checkbox]

NumberValueAccessor

input[type=number]

RadiocontrolValueAccessor

input[type=radio]

RangeValueAccessor

input[type=range]

SelectControlValueAccessor

select

SelectMultipleControlValueAccessor

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 方法来注册用户和控件交互时触发的回调。

Angular之ControlValueAccessor接口怎么使用

formControl会调用名为setUpControl的函数,ControlValueAccessor的实例valueAccessor会被作为参数传入这个函数中。在setUpControl中,ControlValueAccessor的四个方法会在交互时被调用,以完成formControl和元素之间的通信。

拓展:

在使用ControlValueAccessor时需要一同引入NG_VALUE_ACCESSOR,它是使用InjectionToken 创建的可在 Provider 中使用的 Token。我们在编写自己的项目时一般不需要用到InjectionToken,但是在一个框架或者第三方的插件中,它就变得十分有必要了。

export const NG_VALUE_ACCESSOR =    new InjectionToken<ReadonlyArray<ControlValueAccessor>>('NgValueAccessor');

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

providers: [{ provide: TOKEN, useValue: … }]

感谢各位的阅读,以上就是“Angular之ControlValueAccessor接口怎么使用”的内容了,经过本文的学习后,相信大家对Angular之ControlValueAccessor接口怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Angular之ControlValueAccessor接口怎么使用

本文链接: https://lsjlt.com/news/351352.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Angular之ControlValueAccessor接口怎么使用
    这篇文章主要讲解了“Angular之ControlValueAccessor接口怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular之ControlValueAccessor...
    99+
    2023-07-05
  • Angular学习之ControlValueAccessor接口详解
    ControlValueAccessor 是什么?为什么需要使用 ?下面本篇文章就来带大家了解Angular中的ControlValueAccessor组件接口,希望对大家有所帮助!ControlValueAccessor 是什么?简单来说...
    99+
    2023-05-14
    Angular controlvalueaccessor
  • Angular如何使用ControlValueAccessor实现自定义表单控件
    这篇文章主要介绍了Angular如何使用ControlValueAccessor实现自定义表单控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本篇文章给大家介绍一下Angu...
    99+
    2023-06-14
  • Golang开发之接口怎么使用
    今天小编给大家分享一下Golang开发之接口怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Golang的接口是什么在...
    99+
    2023-07-05
  • SAP接口编程之JCoDestination怎么使用
    JCoDestination是SAP Java Connector(JCo)库中的一个类,用于表示到SAP系统的连接。您可以使用JC...
    99+
    2023-10-26
    SAP
  • Angular 5.x之Router怎么用
    这篇文章主要介绍了Angular 5.x之Router怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实例讲解运行结果如下。 设置了3个...
    99+
    2024-04-02
  • 怎么使用API接口
    这篇文章主要介绍“怎么使用API接口”,在日常操作中,相信很多人在怎么使用API接口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用API接口”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!接口交互前...
    99+
    2023-06-16
  • TypeScript接口怎么使用
    这篇文章主要讲解了“TypeScript接口怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TypeScript接口怎么使用”吧!前言:TS的核心原则之一就是对所具有的结构 进行类型检...
    99+
    2023-06-22
  • java.sql.ResultSetMetaData接口怎么使用
    java.sql.ResultSetMetaData接口是用于描述ResultSet中的元数据的接口。它提供了一些方法来获取和操作R...
    99+
    2023-10-23
    java
  • Go接口怎么使用
    本篇内容主要讲解“Go接口怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go接口怎么使用”吧!接口用法简介接口(interface)是一种类型,用来定义行为(方法)。type ...
    99+
    2023-06-30
  • 怎么使用Angular cli
    本篇内容介绍了“怎么使用Angular cli”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 什么是A...
    99+
    2024-04-02
  • C++中怎么使用接口
    C++中怎么使用接口,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先我们需要一些宏://  // Interfaces.h &nb...
    99+
    2023-06-17
  • Java Cloneable接口怎么使用
    要使用Java中的Cloneable接口,您需要遵循以下步骤:1. 在您的类定义中实现Cloneable接口,例如:```javap...
    99+
    2023-08-18
    Java Cloneable
  • C#的INotifyPropertyChanged接口怎么使用
    这篇文章主要介绍“C#的INotifyPropertyChanged接口怎么使用”,在日常操作中,相信很多人在C#的INotifyPropertyChanged接口怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-29
  • Java8中Function接口怎么使用
    这篇文章主要介绍了Java8中Function接口怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8中Function接口怎么使用文章都会有所收获,下面我们一起来看看吧。Java 8 中 Func...
    99+
    2023-07-02
  • 怎么使用C#的API接口
    这篇文章主要介绍“怎么使用C#的API接口  ”,在日常操作中,相信很多人在怎么使用C#的API接口  问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用C#的API接口  ...
    99+
    2023-06-03
  • Node.js怎么使用express写接口
    这篇文章主要讲解了“Node.js怎么使用express写接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js怎么使用express写接口”吧!创建基本的服务器//导入expre...
    99+
    2023-07-05
  • 怎么使用Remix写API接口
    这篇文章主要介绍“怎么使用Remix写API接口”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Remix写API接口”文章能帮助大家解决问题。接口种类普通 get/post api:即可满足...
    99+
    2023-07-06
  • java怎么使用HttpClient调用接口
    这篇文章主要介绍“java怎么使用HttpClient调用接口”,在日常操作中,相信很多人在java怎么使用HttpClient调用接口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么使用HttpC...
    99+
    2023-07-04
  • 怎么使用javascript调用c接口
    今天小编给大家分享一下怎么使用javascript调用c接口的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。创建C接口首先,我...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作