iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Angular如何使用ControlValueAccessor实现自定义表单控件
  • 655
分享到

Angular如何使用ControlValueAccessor实现自定义表单控件

2023-06-14 21:06:14 655人浏览 独家记忆
摘要

这篇文章主要介绍了angular如何使用ControlValueAccessor实现自定义表单控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本篇文章给大家介绍一下Angu

这篇文章主要介绍了angular如何使用ControlValueAccessor实现自定义表单控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

本篇文章给大家介绍一下Angular使用ControlValueAccessor实现自定义表单控件的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

Angular: [ControlValueAccessor] 自定义表单控件


我们在实际开发中,通常会遇到各种各样的定制化功能,会遇到有些组件会与 Angular 的表单进行交互,这时候我们一般会从外部传入一个 FORMGroup 对象,然后在组件的内部写相应的逻辑对 Angular 表单进行操作。如果我们只是对表单中的一个项进行定制,将整个表单对象传入显然不合适,并且组件也会显得臃肿。

<form [formGroup]="simpleForm">                                  <other-component [form]="simpleForm"></other-component>        </form>

那么,我们能不能像原生表单一样去使用这些自定义组件呢?目前,开源组件 ng-zorro-antd 表单组件能和原生表单一样使用 formControlName 这个属性,这类组件就叫自定义表单组件。

如何实现自定义表单控件

在 Angular 中,使用 ControlValueAccessor 可以实现组件与外层包裹的 form 关联起来。

ControlValueAccessor是用于处理以下内容的接口:

  • 将表单模型中的值写入视图/ DOM

  • 在视图/ DOM更改时通知其他表单指令和控件

ControlValueAccessor

ControlValueAccessor 接口定义了四个方法:

writeValue(obj: any): voidreGISterOnChange(fn: any): voidregisterOnTouched(fn: any): voidsetDisabledState(isDisabled: boolean)?: void

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

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

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

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

如何使用 ControlValueAccessor

搭建控件框架

@Component({  selector: 'app-test-control-value-accessor',  templateUrl: './test-control-value-accessor.component.html',  providers: [{    provide: NG_VALUE_ACCESSOR,    useExisting: forwardRef(() => TestControlValueAccessorComponent),    multi: true  }]})export class TestControlValueAccessorComponent implements ControlValueAccessor {  _counterValue = 0;   private onChange = (_: any) => {};  constructor() { }  get counterValue() {    return this._counterValue;  }  set counterValue(value) {    this._counterValue = value;    // 触发 onChange,component 内部的值同步到 form model    this.onChange(this._counterValue);  }  increment() {    this.counterValue++;  }  decrement() {    this.counterValue--;  }  // form model 的值同步到 component 内部  writeValue(obj: any): void {    if (obj !== undefined) {      this.counterValue = obj;    }  }  registerOnChange(fn: any): void {    this.onChange = fn;  }  registerOnTouched(fn: any): void { }  setDisabledState?(isDisabled: boolean): void { }}

注册 ControlValueAccessor

为了获得 ControlValueAccessor 用于表单控件,Angular 内部将注入在 NG_VALUE_ACCESSOR 令牌上注册的所有值,这是将控件本身注册到 DI 框架成为一个可以让表单访问其值的控件。因此,我们需要做的就是NG_VALUE_ACCESSOR 使用我们自己的值访问器实例(这是我们的组件)扩展 multi-provider 。所以设置 multi: true,是声明这个 token 对应的类很多,分散在各处。

这里我们必须使用 useExisting,因为TestControlValueAccessorComponent 可能在使用它的组件中被其创建为指令依赖项。这就得用到 forwardRef 了,这个函数允许我们引用一个尚未定义的对象。

@Component({  ...  providers: [    {       provide: NG_VALUE_ACCESSOR,      useExisting: forwardRef(() => TestControlValueAccessorComponent ),      multi: true    }  ]})export class TestControlValueAccessorComponent implements ControlValueAccessor {  ...}

控件界面

  • test-control-value-accessor.component.html

<div class="panel panel-primary">  <div class="panel-heading">自定义控件</div>  <div class="panel-body">    <button (click)="increment()">+</button>    {{counterValue}}    <button (click)="decrement()">-</button>  </div></div>

在表单中使用

  • app.component.html

<div class="constainer">  <form #form="ngForm">    <app-test-control-value-accessor name="message" [(ngModel)]="message"></app-test-control-value-accessor>    <button type="button" (click)="submit(form.value)">Submit</button>  </form>  <pre>{{ message }}</pre></div>
  • app.component.ts

@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.CSS']})export class AppComponent {  message = 5;  submit(value: any): void {    console.log(value);  }}

感谢你能够认真阅读完这篇文章,希望小编分享的“Angular如何使用ControlValueAccessor实现自定义表单控件”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Angular如何使用ControlValueAccessor实现自定义表单控件

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Angular如何使用ControlValueAccessor实现自定义表单控件
    这篇文章主要介绍了Angular如何使用ControlValueAccessor实现自定义表单控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本篇文章给大家介绍一下Angu...
    99+
    2023-06-14
  • Angular19 中如何自定义表单控件
    这期内容当中小编将会给大家带来有关Angular19 中如何自定义表单控件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 需求当开发者需要一个特定的表单控件时就需要自己...
    99+
    2024-04-02
  • WPF自定义控件如何实现
    今天小编给大家分享一下WPF自定义控件如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方式一:基于现有控件进行扩展,如...
    99+
    2023-07-05
  • Qt自定义控件实现仪表盘
    目录1.预览图2. 代码头文件源文件3. 用法1.预览图 2. 代码 头文件 #ifndef MOTORMETER_H #define MOTORMETER_H #include...
    99+
    2024-04-02
  • winform如何自定义控件列表
    在WinForm中,您可以通过继承现有控件或者创建自定义控件来自定义控件列表。以下是一些常见的方法: 继承现有控件:您可以继承现...
    99+
    2024-04-02
  • Angular中如何实现自定义管道
    这篇文章给大家分享的是有关Angular中如何实现自定义管道的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、管道的作用方便我们在模板中对我们的数据进行格式化处理。二、内置的常用...
    99+
    2024-04-02
  • .NET自定义控件应该如何实现
    本篇内容介绍了“.NET自定义控件应该如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.NET自定义控件有很多人其实不太适应去试用,一...
    99+
    2023-06-17
  • Android如何自定义实现日历控件
    这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. Calendar类2. 布局创建calendar_layout.xml<LinearLayou...
    99+
    2023-06-25
  • Android实现Ant Design 自定义表单组件
    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法(使用起来确实很爽),这时需要...
    99+
    2023-05-31
    ant design 表单组件
  • Android表格自定义控件使用详解
    近期公司要做报表功能,在网上搜索下表格的样式后便自己写了一个自定义的表格控件,该表格控件能根据设置的数据中数据的最大值自动设置左侧信息栏显示的值,使得条形图能尽量的充满控件,条形图部...
    99+
    2024-04-02
  • WPF中用户控件和自定义控件如何使用
    本篇内容主要讲解“WPF中用户控件和自定义控件如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WPF中用户控件和自定义控件如何使用”吧!介绍无论是在WPF中还是WinForm中,都有用户控...
    99+
    2023-07-05
  • Angular如何使用输入框实现自定义验证功能
    这篇文章将为大家详细讲解有关Angular如何使用输入框实现自定义验证功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。此插件使用angular.js、JQuery实现。...
    99+
    2024-04-02
  • Android自定义控件如何在XML文件中使用自定义属性
    目录前言一、为什么需要自定义控件二、具体步骤1.首先我们创建一个 layout xml文件:2.为自定义控件创建java类:3.在res/values下,新建一个attrs.xml文...
    99+
    2023-05-14
    Android XML自定义属性 Android 自定义控件
  • WPF自定义控件的实现
    方式一:基于现有控件进行扩展,如基于button进行扩展,UI可直接用xmal进行编辑设计,逻辑用xaml.cs进行编辑 方法二:直接创建wpf自定义控件 本文用方法二开展自定义...
    99+
    2023-03-03
    WPF自定义控件
  • winform如何自定义控件
    在WinForms中自定义控件通常涉及以下步骤: 创建自定义控件类:创建一个继承自现有控件(如Control或Panel)的新类...
    99+
    2024-04-09
    winform
  • antdform表单如何处理自定义组件
    目录antd form表单处理自定义组件以下是从antd找到的解决思路antd form表单中嵌套自定义组件表单部分自定义组件总结antd form表单处理自定义组件 使用 antd...
    99+
    2023-05-17
    antd form表单 处理自定义组件 form表单自定义组件
  • 如何使用AJAX扩展器自定义控件
    小编给大家分享一下如何使用AJAX扩展器自定义控件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!掩码编辑功能的必要性在 HTML 中,接受输入数据的唯一方式是使用 <input>...
    99+
    2024-04-02
  • android 自定义控件 使用declare
    在Android中,可以使用`declare-styleable`来定义和使用自定义控件的属性。下面是一个简单的示例:1. 在res...
    99+
    2023-09-21
    Android
  • VueelementUI自定义表单模板组件功能实现
    elementUI 实现一个自定义的表单模板组件注:该功能基于elementUI 背景:在项目开发中,我们会遇到这种需求,在管理后台添加自定义表单,在指定的页面使用定义好的表单 直...
    99+
    2022-12-24
    Vue elementUI 自定义表单模板组件 Vue elementUI 自定义表单
  • Android自定义实现日历控件
    本文实例为大家分享了Android自定义实现日历控件的具体代码,供大家参考,具体内容如下 1. Calendar类 2. 布局 创建calendar_layout.xml <...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作