Angular:指令中的 updateValueAndValidity

2024-01-04

我有一个指令,如果输入值是整数,则在模糊时附加小数。下面是实现。

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

@Directive({
  selector: '[price]',
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => PriceDirective),
      multi: true
    }
  ]
})
export class PriceDirective implements ControlValueAccessor {

  constructor(private el: ElementRef) { }

  // ControlValueAccessor interface
  private _onChange = (_) => { };
  private _onTouched = () => { };

  @HostListener('blur', ['$event'])
  input(event) {
    !!event.target.value ? $(this.el.nativeElement).val(Number(event.target.value).toFixed(2)) : $(this.el.nativeElement).val(null);

    this._onChange(parseFloat(event.target.value));
    this._onTouched();
  }
  writeValue(value: any): void {
    !!value ? $(this.el.nativeElement).val(Number(value).toFixed(2)) : $(this.el.nativeElement).val(null);
  }

  registerOnChange(fn: (_: any) => void): void { this._onChange = fn; }
  registerOnTouched(fn: any): void { this._onTouched = fn; }

}

事情按预期进行。

但是,由于当以编程方式更改值时,Angular 不会触发验证,因此具有此指令的文本框不会被验证。

在这种情况下,除了通过传递之外,如何通过其他方式启用验证control引用作为指令的输入并调用updateValueAndValidity就可以了,或者打电话updateValueAndValidity on input or blur.

如果有人建议我一种从指令本身触发验证的方法,那就太好了。


我用这种方式解决了同样的问题。 这是我的第一个方法。

  update() {

    // ...

    const el = this.el.nativeElement;
    const reg = new RegExp(this.textMaskConfig.replacement);

    el.value = this.prevStr.replace(reg, this.currentChar);

    // ...

  }

但它不会触发验证事件。所以我得到了NgControl组件和使用setValue() method.

  constructor(private el: ElementRef, private ctrl: NgControl) {   
  }

  @HostListener('keydown', ['$event']) onKeyDownHandler(e) {
    this.ctrl.control.setValue(value);
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular:指令中的 updateValueAndValidity 的相关文章

随机推荐

  • WSS 在 http 上工作吗?

    是否可以通过 http 建立 wss 协议 我在论坛上读到 ws 可以与 http 一起使用 但是 wss 只能与 https 一起使用吗 真的吗 因为我试图在本地主机上的 wamp 上测试它 但不起作用 ws告诉 WebSocket 客户
  • 如何在 Xcode 中创建可重用代码包?

    我正在开发一个 iPhone 应用程序 必须解析 xml 文件才能将它们放入数据库中 我还将在我的应用程序中使用相同的 xml 解析器 以便用户可以导入自己的数据 我想知道如何将这些 xml 解析器提取到捆绑包或库中 以便我可以在我的 iP
  • 如何使用 Android 将 .pdf .doc .txt 文件上传到服务器(mysql 数据库)

    我在将文件上传到服务器时遇到一些困难 我需要知道使用名称值对上传文件的完整代码 听到的是我的 android 代码 我只得到我的文件路径 如何将其上传到服务器 引用为 nameValuePairs add new BasicNameValu
  • Backbone.js `listento` 不会针对过滤后的集合触发

    listento仅针对全局集合触发 而不是我在创建视图时传递给视图的集合 例如 var MyView Backbone View extend initialize function this listenTo notes add this
  • 如何在浏览器中录制声音?

    我需要用户在浏览器上录制他们的声音 然后自动将生成的 mp3 上传到网络服务器 我认为用户按下一个大的开始记录 停止记录按钮来执行此操作 然后 这会将文件保存在用户硬盘上 然后它会被有效地压缩并自动通过 ftp 传输到网站 是否可以使用 A
  • 有条件地通过管道传输到 Out-Null

    我正在编写一个 PowerShell 脚本msbuild一堆解决方案 我想计算有多少解决方案构建成功 有多少解决方案失败 我还想查看编译器错误 但仅限于第一个失败的错误 我假设其他错误通常也会出现类似的错误 并且我不想弄乱我的输出 我的问题
  • MySQL:“您的 SQL 语法有错误...靠近 'desc) VALUES ('Idea','Description')'”[重复]

    这个问题在这里已经有答案了 我正在尝试让 MySQL 为我的表单提交工作 当我尝试插入表时遇到问题 当我将信息放入表单并单击 提交 时 在本例中 一个字段中的信息为 想法 另一个字段中的信息为 描述 我收到以下响应 您的 SQL 语法有错误
  • 如何将 React 组件的 props 传递给样式组件

    我正在尝试根据以下内容设置样式组件的高度props它所在的 React 组件的名称 我尝试了以下方法 const Styled styled div height props gt props height class Parent ext
  • Camel-SQL 为什么使用 StreamList 似乎会加载所有 ResultSet?

    Hi 我想做什么 我目前正在开发一个 ESB 项目 apache camel spring boot 2 其中我读取了一个包含超过 100 000 000 行的 MySQL 表 我一次清空该表 1 行 转换该行并将其发送到另一个数据库 我怎
  • 如何解决使用CMAKE 3.4.1和VS2015编译带有额外模型的opencv3.0时找不到包含文件的问题

    使用 CMAKE 3 4 1 和 VS2015 构建 OPENCV 3 0 时 VS2015出现以下错误 error C2264 std tuple
  • 在子目录中安装 django

    我在 Ubuntu 14 上运行 apache2 服务器 现在我想配置 Apache 与 mod wsgi 一起使用 以便在 www abc com lab 等域的子目录上运行 Django 但我总是无法做到这一点 顺便说一下我已经成功安装
  • 交叉编译:特殊的交叉编译器还是只是带选项 -march 的 gcc?

    我需要在Linux机器上为Raspberry PI 3 编译一个程序 并且代码必须符合c 17标准 官方工具链已经过时 并且缺少 c 17 编译选项 我现在可以看到的两个解决方案是 1 gcc有一个选项 march 其描述如下 https
  • 在 HTML 中使用 SVG 绘制新月

    是否可以在 HTML 中使用 SVG 绘制新月 我一直在尝试W3学校 http www w3schools com svg 但我没有看到这样的例子 我不需要您在 新月 的典型谷歌图像中看到的任何阴影 只需一个实心边框新月 您可以绘制带有两个
  • Activity和Fragment之间如何进行回调?

    我的活动中有这个界面 public interface LogoutUser void logout 我的片段实现了这个接口 所以在我的片段中 我有这个 Override public void logout logout 在我的活动中我打
  • 解锁 xcode 文件?

    几天前 我的 Mac 出现了问题 所以我把它带到了当地一家苹果商店的 Genius 吧 他们说硬盘上的分区出现故障 必须重新格式化 我使用一个程序自动将系统备份到外部服务器 所以我不担心丢失任何东西 他们重新格式化 我已经把东西放回原位 我
  • 创建新控制器 - 运行所选代码生成器时出错

    我正在使用 Visual Studio Express 2013 for Web 特别是版本 12 0 21005 1 REL 这是我使用 VS2013 的第一个项目 到目前为止我一直在使用 VS2012 我正在尝试在我的 asp net
  • Google 视频不再能够检索字幕?

    截至 4 天前 您可以向以下地址发送 GET 请求或访问并接收包含给定 YouTube 视频的字幕轨道的 xml 响应 有谁知道此支持是否已被删除 因为从今晚开始 它不再提供带有字幕的 xml 响应 每个视频的页面都是空的 有许多视频在 4
  • 如何在 jasmine 测试中模拟导出的打字稿函数?

    我正在尝试在 Jasmine 测试中模拟从打字稿文件导出的函数 我希望以下内容能够模拟导入的foo并返回 bar 规范中的值 1 模拟似乎没有被调用 所以我显然错过了一些东西 我该如何修复这个例子 demo ts export functi
  • MySQL Workbench 编辑表数据是只读的

    当尝试在 MySQL Workbench 5 2 37 中编辑表数据时 其处于只读模式 仅当表具有主键时才可编辑 是否有任何修复来处理没有主键的表 作为建议之一 我尝试升级 WB 5 2 40 但这个问题仍然存在 我假设该表有一个主键 首先
  • Angular:指令中的 updateValueAndValidity

    我有一个指令 如果输入值是整数 则在模糊时附加小数 下面是实现 import Directive ElementRef Input OnInit HostListener forwardRef from angular core impor