angular : 自定义组件双向绑定 [(ngModel)]

2023-11-11

NG_VALUE_ACCESSOR

用于为表单控件提供 ControlValueAccessor

interface ControlValueAccessor {
  writeValue(obj: any): void
  registerOnChange(fn: any): void
  registerOnTouched(fn: any): void
  setDisabledState(isDisabled: boolean)?: void
}

双向绑定 示例组件:

import {
  ChangeDetectionStrategy,
  ChangeDetectorRef,
  Component,
  forwardRef,
} from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';
 
@Component({
  selector: 'my-input',
  styleUrls: ['./my.input.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => MyInputComponent),
      multi: true,
    },
  ],
  template: `
    <input type="text" #inputElement 
        [(ngModel)]="value"  
        (ngModelChange)="modelChange($event)"/>
    <button (click)="clickMe()">change</button>
  `
})
export class MyInputComponent implements ControlValueAccessor {
  
  private onTouch = () => {};
  private onChange = (newValue: any) => {};
 
  value = '';
  index = 0; // for test manual change value
 
  constructor(
    private cdr: ChangeDetectorRef
  ) { }


  clickMe() {
    const v = 'index : ' + (++this.index);
    this.value = v;
    this.onChange(v);
  }

    
  modelChange(newValue: string) {
    this.onChange(newValue);
  }
 
  // ControlValueAccessor - 
  // 至少需要实现 writeValue, registerOnChange,registerOnTouched
  writeValue(v: any) {
    if (v !== this.value) {
      this.value = v;
    }
    // on push
    this.cdr.markForCheck();
  }
 
  registerOnChange(fn: any) {
    this.onChange = fn;
  }
 
  registerOnTouched(fn: any) {
    this.onTouch = fn;
  }
}

registerOnTouched 的参数 fn:

 registerOnChange 的参数 fn :

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angular : 自定义组件双向绑定 [(ngModel)] 的相关文章

随机推荐

  • C语言char类型的存储

    目录 char是如何存储的 char的类型 char的取值范围 例题 char是如何存储的 字符型 char 用于储存字符 character 如英文字母或标点 但是char类型在内存中并不是以字符的形式储存 而是以ASII码的形式储存 也
  • 为什么组件中的data是一个函数,而不是一个对象?

    1 组件是vue实例的服用 我们希望每个组件都是独立的 我们必须保证各组件里面的数据相互分离 所以组件中的data应该定义为函数形式 并且返回一个对象 2 如果组件中的data是一个对象 每一次调用的组件中使用的数据都是对data中的数据的
  • Linux(centos 7.4)升级openssh编译报错checking whether OpenSSL‘s headers match the library... no

    Linux centos 7 4 升级openssh编译报错checking whether OpenSSL s headers match the library no 解决方案 使用root用户打开文件并编辑 vim etc ld so
  • chatgpt赋能python:Python面向对象编程

    Python面向对象编程 Python是一种支持面向对象编程范式的高级编程语言 在Python中 面向对象编程可以很容易实现 同时也可以让代码更加简洁 可读性更高 什么是面向对象编程 面向对象编程 Object Oriented Progr
  • webpack安装遇到问题 webpack -v得到不是版本号信息

    webpack v得到不是版本号信息且vscode终端打包时报错如下 如图所示 使用npm install webpack webpack cli global 安装完webpack后 运行webpack v却出现如下错误 查阅资料分析原因
  • 清除dell服务器面板告警信息,dell服务器报警信息资料.doc

    沈阳鑫微明信息 技术支持 024沈阳鑫微明信息 技术支持 024DELL服务器LCD信息代码 DELL服务器LCD信息代码的意思 E1114Temp Ambient系统周围环境温度超出允许范围 E1116Temp Memory内存已超过允许
  • element-plus获取表格的所有选中项

    1 在el table中定义 selection change事件
  • 生产redis线程池获取不到资源问题排查

    1 查看错误日志7点报redis clients jedis exceptions JedisExhaustedPoolException Could not get a resource since the pool is exhaust
  • NSGA-II算法实战(附MATLAB源码)

    1 NSGA II算法原理 NSGA II算法全称非支配排序遗传算法II Non dominated Sorting Genetic Algorithm II NSGA II 该算法是由 NSGA 改进而来的 用于解决复杂的 多目标优化问题
  • centos7如何配置静态ip?

    1 切换到root用户 su root 2 获取可用IP地址 dhclient 这一步成功后 用ifconfig命令查看已分配的可用ip 并写到下面网卡配置中 本例中是 192 168 154 132 3 编辑网卡配置 修改标记部分 vim
  • 【前后端分离博客】学习笔记05 --- canal

    一 概述 使用canal rabbitMQ 实现 MySQL 和 Elasticsearch 的数据同步 图解 流程如下 给mysql开启binlog功能 mysql完成增 删 改操作都会记录在binlog中 canal监听binlog变化
  • caffe源码导读(六)layer.hpp头文件解析

    文章目录 一 前篇 二 正文layer hpp头文件解析 三 layer cpp相关的一些理解 四 关于序列化以及第57行为什么要先reset的小例子 本篇为基于 lt 深度学习21天实战caffe gt 所做的学习笔记 如果错误 欢迎指导
  • Ruby on rails 或 Ruby Goliath 利用redis + sidekiq 实现异步处理机制

    使用背景 在平常工作中 出于性能考虑 很多工作或者任务可以放到后台悄悄咪咪地执行 而在接口层或者界面交互的地方 给用户快速返回 利用Redis Sidekiq的组合方式 能够在Ruby on Rails web框架或者Ruby Goliat
  • 帧差法、光流法、背景减除法

    运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像中提取出来 通常情况下 目标分类 跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域 因此运动目标的正确检测与分割对于后期处理非常重要然而 由于场景的动态变化 如
  • Java限制泛型可用类型与泛型通配的方式

    1 限制泛型可用类型概念 1 在定义泛型类别时 默认在实例化泛型类型的时候可以使用任何类型 但是如果想要限制泛型类型时 只能用某个特定的类型或者是其子类型才能实例化该类型时 可以定义类型时 使用extends关键字指定这个类型必须是继承某个
  • Apollo配置参数读取后再做替换

    1 先描述业务场景 在Apollo上做配置 然后读取配置 然后做替换 2 一路坎坷 2 1 在Apollo上配置 但是vlue包含有占位符 获取配置报错 Injection of autowired dependencies failed
  • docker mysql镜像忽略表名大小写

    1 安装mysql镜像 docker pull mysql 2 运行mysql docker run net host restart always privileged true v usr docker dat mysql data v
  • Linux基础学习笔记(五)——文件的ACL权限

    Linux基础学习笔记 五 文件的ACL权限 文章目录 Linux基础学习笔记 五 文件的ACL权限 前言 什么是ACL控制 setfacl getfacl mask 最大有效ACL权限 默认的ACL权限和递归的ACL权限 小结 前言 这一
  • Action行动算子 及相应的举例

    7 Action行动算子 转换算子 起始就是记录了数据的一个操作流程 RDD1 gt RDD2 gt RDD3 gt RDD4 流式运算现象 RDD1 到 RDD4 之间维护血缘关系 操作行为 RDD的转换算子是lazy加载 不执行行动算子
  • angular : 自定义组件双向绑定 [(ngModel)]

    NG VALUE ACCESSOR 用于为表单控件提供 ControlValueAccessor interface ControlValueAccessor writeValue obj any void registerOnChange