触摸/未触摸未在自定义输入组件中更新 - Angular 2

2024-01-08

我有一个自定义输入组件,它正在更新验证和状态(触摸/未触摸除外)。其他所有状态(原始/脏)都按预期工作。

这是一个笨蛋:https://plnkr.co/edit/O9KWzwhjvySnXd7vyo71 https://plnkr.co/edit/O9KWzwhjvySnXd7vyo71

import { Component, OnInit, Input, ElementRef, forwardRef, Renderer } from '@angular/core';
import { REACTIVE_FORM_DIRECTIVES, Validator, Validators, NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';



export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = /*@ts2dart_const*/ {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => CustomInputComponent),
  multi: true
};

const noop = () => {};

@Component({
  selector: 'my-custom-input',
  providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR],
  template: `
  <div class="form-group">
    <label>CUSTOM INPUT</label>
    <input type="text" class="form-control" [(ngModel)]="value" required>
    <p *ngIf="control.errors.required && control.touched">Field is required</p>
    <strong>Has input been touched: {{control.touched ? 'Yes' : 'No'}}</strong><br>
    <strong>Is input untouched: {{control.untouched ? 'Yes' : 'No'}}</strong><br>
    <strong>Is input dirty: {{control.dirty ? 'Yes' : 'No'}}</strong> <br>
        <strong>Is input pristine: {{control.pristine ? 'Yes' : 'No'}}</strong>
  </div>
  <div>
    In Custom Component: {{value}}
  </div>
`
})


export class CustomInputComponent implements ControlValueAccessor {
  @Input() control;


  // The internal data model
  private _value: any = '';

  //Placeholders for the callbacks
  private _onTouchedCallback: (_:any) => void = noop;

  private _onChangeCallback: (_:any) => void = noop;

  //get accessor
  get value(): any { return this._value; };

  //set accessor including call the onchange callback
  set value(v: any) {
    if (v !== this._value) {
      this._value = v;
      this._onChangeCallback(v);
    }
  }

  //Set touched on blur
  onTouched(){
    this._onTouchedCallback(null);
  }

  //From ControlValueAccessor interface
  writeValue(value: any) {
    this._value = value;
  }

  //From ControlValueAccessor interface
  registerOnChange(fn: any) {
    this._onChangeCallback = fn;
  }

  //From ControlValueAccessor interface
  registerOnTouched(fn: any) {
    this._onTouchedCallback = fn;
  }

}

谢谢你的帮助!


刚刚踩到@sharpmachine 的答案,它帮助解决了我的问题。我只是想改进它:

而不必绑定blur事件至onTouched()在模板级别(可能容易出错)可以公开ControlValueAccessor as a Directive并将事件绑定在那里。

import { Directive, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => CustomInputAccessor),
  multi: true
};

@Directive({
  selector: 'my-custom-input',
  host: {'(blur)': 'onTouched($event)'},
  providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR],
})
export class CustomInputAccessor implements ControlValueAccessor {

  // The internal data model
  private _value: any = '';

  public onChange: any = (_) => { /*Empty*/ }
  public onTouched: any = () => { /*Empty*/ }

  get value(): any { return this._value; };

  set value(v: any) {
    if (v !== this._value) {
      this._value = v;
      this.onChange(v);
    }
  }

  writeValue(value: any) {
    this._value = value;
  }

  registerOnChange(fn: any) {
    this.onChange = fn;
  }

  registerOnTouched(fn: any) {
    this.onTouched = fn;
  }
}

这样您应该能够使用该组件而无需绑定blur每次使用它时都会发生事件。

希望能帮助到你!

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

触摸/未触摸未在自定义输入组件中更新 - Angular 2 的相关文章

  • Angular 2在两个组件之间传递数据

    我想在两个组件之间传递数据 但我的问题是 我有两个组件 假设一个是 主 另一个是 模态对话框 在我的主要部分中 我想打开模态对话框并从模态对话框中获取数据 而无需离开我的主要组件 我知道如何使用 Input 但我看不到在我的应用程序中使用它
  • 角度 2 ngIf 与可观察?

    我有一个非常简单的服务 它的工作是从 api authenticate url 获取 200 或 401 auth service ts Injectable export class AuthService constructor pri
  • 角度2多次错误TS2300:重复的标识符

    系统配置 ubuntu 14 04 节点 v gt v5 6 0 npm v gt 3 7 1 打字最新版本 不知道如何获取版本详细信息 第一次使用 angular2 时 我的文件夹样本 服务器结构如下 server js server t
  • 具有 Universal 和 Ionic 的 Angular SSR 不会在页面源中显示实际数据

    我有一个 nguniversal 的 Angular 11 项目 我的主页正在从内部 翻译键对象 和外部 用于显示链接列表的快速节点服务器 服务获取数据 后端域与前端域地址不同 该网站显示正确 但由于某种原因 当我检查该网站时 最初未加载翻
  • 如何在角度通用中使用localStorage?

    我正在使用 angular v4 0 3 和 webpack 2 2 0 使用它工作得很好Auler http ium com evertonrobertoauler angular 4 universal app with angular
  • 注入需要构造函数参数的服务

    我有一项服务需要启动一些值 Injectable export class MyService private myVals any constructor init any this myVals init 而消费者 Component
  • 为什么 Angular 4.3 中的 httpclient 返回 Object 而不是 any?

    Angular 4 3 中的新 HttpClient 类似乎又回来了Object代替any默认情况下 鉴于打字稿文档所述 这样做是否有特殊原因 永远不要使用数字 字符串 布尔值或对象类型 这些 类型指的是几乎从未使用过的非原始装箱对象 适当
  • 如何在菜单中显示用户名

    我有一个 user name 我的 app component ts 中的变量 我想用它来显示用户登录后从本地存储获取的用户名 但这仅在应用程序启动时加载 我想在用户登录后重新加载它 当我在登录后关闭并重新打开应用程序时 它工作正常并显示用
  • 如何使用 angular2 的路由器实现面包屑[重复]

    这个问题在这里已经有答案了 I use angular2最近 但不知道如何实施breadcrumb组件 任何人都可以帮忙吗 div class row style padding top 15px ol class breadcrumb l
  • 单元测试 HttpClientModule 时出错(Angular 4.3+)

    我正在探索新的 Angular HttpClientModule 并遇到莫名其妙的错误 该模块足够新 我还找不到任何有关如何进行单元测试的有用信息 并且官方文档没有任何示例 该应用程序包含一个具有一种方法的服务 该方法将 URL 传递给ht
  • Chartjs + Angular6 未显示图表或任何错误

    我正在尝试以角度实现chart js 编写了一个简单的代码来在html上显示图表 但是页面上没有输出 也没有错误 我不明白问题出在哪里以及为什么显示图表失败 堆栈闪电战 https stackblitz com edit angularch
  • router.navigate 更改 URL,但不渲染组件

    而不是使用 a href my path my param a 在我的模板中 我愿意使用带参数的函数将我重定向到页面 所以 这就是我在 ts 文件中构建函数的方式 redirectToChat my param this router na
  • Angular 2 形式 + OnPush

    我正在编写一个 Angular 2 应用程序 出于性能原因 我尝试在任何地方使用 ChangeDetectionStrategy OnPush 我有一个复杂的组件 需要 OnPush 才能顺利工作 其中包含另一个显示表单的组件 使用 For
  • 组件没有路由配置 - 嵌套路由 angular2 RC1

    我有嵌套路线 Routes path component RootComponent path parent component ParentComponent 二级路由有参数 Routes path id component ChildC
  • 如何在 Angular 2 Material Autocomplete 中获取所选项目的值

    我使用 Angular Material 创建了一个自动完成字段 并成功从 Web api 获取国家 地区列表 CountryID gt 项目值 或索引 国家 地区 gt 项目文本 当我尝试获取所选项目的值 而不是文本 时 它会按预期返回文
  • 具有动态名称的 Angular Material 2 日期选择器

    我正在尝试实现具有动态名称的日期选择器组件 我正在使用 Angular 4 开发基于 Angular Material 2 的项目 这是我的实现
  • Angular 7 Guard 重定向仅适用于双击

    问题是我已经实现了一个 Guard 旨在处理特定的目录 如果当前用户名的角色等于 2 它应该返回 true 如果没有 那么它不应该重定向 这是我的 app routing module ts 文件 问题出在 userlist 路径中 我们是
  • 将 Angular v12 升级到 v13 时出现“模块未找到”错误

    嗨 开发者和贡献者 我正在努力找出以下错误的问题所在 src app models type ModelType ts 2 0 44 错误 找不到模块 错误 导出字段无法解析目录 请求为 当我将 Angular 版本从 v12 升级到 v1
  • “.builders['browser']”应该具有必需的属性“class”

    使用 npm install 成功安装依赖项后 在运行服务器时出现以下错误 Schema validation failed with the following errors Data path builders browser shou
  • html输入数字,min + step,使step忽略min?

    是否有可能使step忽略min属性

随机推荐

  • php数据库的最佳选择[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ember.js:如何基于assets/vendor-*.js进行调试

    这是一个更普遍的问题 但我想其他人也遇到过这个问题 例如参见这个SO问题 Ember js 如何分析vendor js中的错误 https stackoverflow com questions 31273979 ember js how
  • 安卓FTP服务器

    我正在使用以下code http code google com p simpleftp source browse trunk src com googlecode simpleftp FTPServer java r 4使 Androi
  • Mongoose findOne 带有“非此即彼”查询[重复]

    这个问题在这里已经有答案了 我有一个 Mongo 用户数据库 正在使用 Mongoose 查询 我想做 findOne 来确定用户是否已经存在 我希望它首先搜索用户是否已存在带有电子邮件的用户 如果不存在 则应该搜索是否存在带有电话的用户
  • 使用 powershell 部署到 azure 函数

    有什么办法可以使用 powershell 脚本部署到 azure 函数吗 CI 不适用于我们 因为我们使用 octopus 部署来部署到我们所有的生产服务 因此 如果有一种方法可以使用 powershell 脚本进行部署 那将是有益的 Th
  • 不支持实时更新include_values

    我想更新 callback url https graph facebook com subscriptions 但问题是我无法添加 include values 这是一个非常大的问题 因为我的整个程序都与 错误 message 不支持 1
  • Facebook user_id 作为 MongoDB BSON ObjectId?

    我正在重建脸书上的恋人 http www facebook com loversapp与 Sinatra 和 Redis 一起 我喜欢 Redis 因为它没有很长的 12 字节 BSON 对象 ID http www mongodb org
  • JavaScript 正则表达式:查找非数字字符

    假设我有这两个字符串 5 15 1983 和 1983 05 15 假设字符串中的所有字符都是数字 除了可以出现在字符串中任何位置的 分隔符 字符 只有一个分隔符 字符串中任何给定非数字字符的所有实例都将是相同的 如何使用正则表达式提取该字
  • Android:注册新的电信 PhoneAccount

    我正在尝试做一个新的电话帐户 http developer android com reference android telecom PhoneAccount html使用我的实现连接服务 http developer android c
  • GitLab CI 凹凸 Python 包版本

    我想知道是否可以在 gitlab ci runner 中更改存储在 gitlab 中的 Python 包版本 我有示例包结构 package src init py main py setup py Dockerfile gitlab ci
  • 如何在Python中声明静态属性?

    如何在 Python 中声明静态属性 这里写了如何声明一个方法 Python 中的静态方法 https stackoverflow com questions 735975 static methods in python Python 中
  • 使用接口类型访问类变量

    我正在听课 class MyClass implements Intrfc String pickmeUp Its Me public static void main String args Intrfc ob new MyClass o
  • 具有主动-主动 Azure Sql Server 数据库复制

    我们可以对 Azure SQL 数据库进行被动只读异步实时同步 以实现灾难恢复 但我们的要求是在两个活动读写数据库之间实现实时同步 以便为世界不同地点的客户提供低延迟 例如 我正在提供电子商务网站 我将在其中之一更新数据 数据库服务器和其他
  • 如何用 ng-transclude 替换元素

    是否可以将元素替换为ng transclude在它而不是整个模板元素上 HTML div div someData div div 指示 return restrict A templateUrl templates my transclu
  • 违反 scalaz 中未来单子的左恒等律

    假设我定义了一个实例Monad类型类为Future val futureMonad new Monad Future override def point A a A Future A Future a override def bind
  • 什么类型的 HealthKit 装置用于测量最大摄氧量? - 斯威夫特 4

    我正在 Swift 4 中编写一个使用 Apple HealthKit 的应用程序 我正在尝试写入 VO2 Max 指标 但我不确定使用哪个单位 在健康应用程序本身中 单位被列为 mL kg min 但我在苹果文档中没有看到类似的内容her
  • 请求 utl_http 包时 Oracle 错误“ORA-28759:无法打开文件”

    我无法执行以下语句 DECLARE lo req UTL HTTP req lo resp UTL HTTP resp BEGIN UTL HTTP SET WALLET file C app wallet abcd 1234 lo req
  • 由于应用程序标识符权限,应用程序安装失败

    由于应用程序标识符权限 我无法安装 watchOS 2 WatchKit 应用程序 在 功能 选项卡中打开 应用程序组 后会发生这种情况 完整错误 应用程序安装失败 此应用程序的应用程序标识符权利与已安装的应用程序的权利不匹配 这些值必须匹
  • 如果我在 C 或 C++ 中执行“typedef”,什么时候应该在 typedef 类型的末尾添加“_t”? [复制]

    这个问题在这里已经有答案了 我很困惑什么时候应该添加尾随 t to typedef ed 类型 例如 我应该这样做 typedef struct image image t or this typedef struct image imag
  • 触摸/未触摸未在自定义输入组件中更新 - Angular 2

    我有一个自定义输入组件 它正在更新验证和状态 触摸 未触摸除外 其他所有状态 原始 脏 都按预期工作 这是一个笨蛋 https plnkr co edit O9KWzwhjvySnXd7vyo71 https plnkr co edit O