如何在动态更新时检测输入的值变化(Angular 6)

2024-04-25

我正在使用自定义指令和自定义管道对文本输入进行货币格式化。它适用于任何类型的直接用户输入(焦点、模糊、按键)。但是,当值动态更改时,我似乎无法捕获更改事件。我也找不到可靠的主机侦听器事件列表,并且不知道如何捕获进入输入的任何事件(因此无法看到正在发生什么事件(如果有))。

动态地,该值是用 patchValue 设置的,并且我已将 emmitEvent 设置为 true,但这似乎没有执行任何操作(无论如何我认为默认情况下它是 true):

myInput.patchValue({content: currentContent}, { emitEvent: true });

我可以在使用 patchValue 设置内容值之前重写货币格式,但这不利于可重用性。

这是我的指令:

import { Directive, HostListener, ElementRef, OnInit } from '@angular/core';
import { CurrencyPipe } from '../pipes/currency.pipe';

@Directive({
    selector: '[appCurrency]'
})
export class CurrencyDirective implements OnInit {

constructor(
    private elementRef:ElementRef,
    private formatcurrencypipe:CurrencyPipe
) { }

ngOnInit(){
    //this.elementRef.nativeElement.value = this.formatcurrencypipe.transform(this.elementRef.nativeElement.value);
}

@HostListener("change", ["$event.target.value", "$event"]) onChange(value, event) {
    //this.elementRef.nativeElement.value = this.formatcurrencypipe.parse(value);
}

@HostListener("valueChange", ["$event.target.value", "$event"]) onValueChange(value, event) {
    console.log('in onValueChange');
    //doesn't trigger when the value is changed dynamically
}

@HostListener("focus",["$event.target.value","$event"]) onFocus(value,event) {
    console.log('in focus');
    this.elementRef.nativeElement.value = this.formatcurrencypipe.parse(value);
    if(event.which == 9)
    {
        return false;
    }
    this.elementRef.nativeElement.select();
}

@HostListener("blur", ["$event.target.value"]) onBlur(value) {
    console.log('in blur');
    this.elementRef.nativeElement.value = this.formatcurrencypipe.transform(value);
}

@HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    console.log('e.keyCode: ', e.keyCode, e.ctrlKey, e.metaKey);
    //delete, backspace, tab, escape, enter, decimal, period, arrow left, arrow right
    if ([46, 8, 9, 27, 13, 110, 190, 37, 39].indexOf(e.keyCode) !== -1
    || (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) //CTRL + A
    || (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) //CTRL + C
    || (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) //CTRL + V
    || (e.keyCode === 88 && (e.ctrlKey || e.metaKey))) {  //CTRL + X
        //do nothing
        return;
    }

    // Check for number
    if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
        e.preventDefault();
    }
}
}

我在这里添加了 stackblitz:https://stackblitz.com/edit/angular-tys9cy https://stackblitz.com/edit/angular-tys9cy


反应式表单实例,例如FormGroup and FormControl have a valueChanges返回一个方法observable发出最新值。它不会发出 DOM 事件。
Solution

代替valueChange绑定到ngModelChange这将在两个事件上触发,即当 formControl 在视图中或通过模型更新时。

@HostListener("ngModelChange", [ "$event"]) onNgModelChange(value) {
         console.log(value)
    this.elementRef.nativeElement.value = this.formatcurrencypipe.transform(value);
}

Working StackBlitz https://stackblitz.com/edit/angular-g8zsmt

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

如何在动态更新时检测输入的值变化(Angular 6) 的相关文章

  • Angular 2子组件引用父组件

    我有一个包含三个组件的应用程序 应用程序 编辑视图 对话框 应用程序组件包含 EditView 组件 该组件可以包含许多其他 EditView 组件和一个 Dialog 组件 如果 Dialog 组件在页面上可见 对话框组件包含应用程序组件
  • NativeScript 中的多行文本框

    如何在本机脚本中获取支持多行的文本区域 我尝试过使用不支持多行的文本字段 还尝试过此代码将多行添加到文本字段 var myTextfield this page getViewById
  • ngClass多次调用方法[重复]

    这个问题在这里已经有答案了 我创建了一个方法并将其附加到 ngClass 以根据条件添加两种样式 我还将数字作为参数传递以在 switch case 中使用 组件 html div class circle div class circle
  • Angular routerLink没有导航到相应的组件

    我在 angular2 应用程序中的路由运行良好 但我将根据以下内容制作一些routeLinkthis https angular io docs ts latest guide router html 这是我的路由 const route
  • 无法在代理后面使用量角器运行 Angular > 2 e2e

    将不胜感激任何帮助 我在windows上运行 我在全球安装了量角器版本5 3 0 在更新网络驱动程序之前我运行 webdriver manager clean 并更新版本如下 webdriver manager 更新 ie32 proxyh
  • 解析 Angular2 中的 xml 以在视图中呈现

    我是否需要解析 xml 以从 xml 获取数据以在 html 中呈现 我目前正在使用获取本地 xml 文件http get请求并在控制台日志中显示 xml 文件中的所有信息 我认为它只是在读取它 问题是如何在angular2中将xml转换为
  • 重置表单的最简洁方法

    在 Angular 2 最新版本中重置表单的最简洁方法是什么 我想在添加帖子后重置输入文本框 Component selector post div template h2 Posts h2
  • 如何将 JSON 响应映射到 Angular 4 中的模型

    我已经尝试了很多 但无法将端点响应映射到我的模型 我正在使用 HttpClient 和 Angular4 我从服务中获取了数据 但它没有正确映射到我的模型类 我有以下 JSON 服务正在返回 result id 1 type User co
  • 如何在 Angular2 中嵌入视频?

    我想开发单页应用程序 它是一个视频门户 用户可以登录 查看视频列表 导航到单个视频 对视频进行评分 并可以执行所有媒体相关任务 例如 播放 暂停 调整音量和寻找视频位置 既然有
  • Angular Material 10 日期选择器(mat-datepicker)与其他输入字段不对齐

    使用 Angular 10 和 Angular Material 10 在表单中使用日期选择器与其他输入表单字段不对齐 如下图所示 字段未对齐 https i stack imgur com D4Hc4 png component html
  • Angular 5 webpack 3 aot

    我正在尝试使用 webpack 3 和 Angular 5 进行 aot 构建 但是网上有很多教程 没有一个没有问题地显示完整的示例 到目前为止我已经有了以下配置 对于那些对路径有疑问的人 我在 java 应用程序中使用它 webpack
  • 如何在 Angular 4 材料的 Stepper 中提交表单

    如何在角材料的步进器中提交表单数据 我正在遵循角材料的示例https material angular io components stepper examples https material angular io components
  • 以角度搜索输入字段?

    这里我有folderObjs数组和该数组的控制台位于下面的代码中 我将搜索输入字段放在搜索输入字段中 我想按角度搜索该数组的folderName和folderSize 这怎么可能 HTML
  • ionic 2 从 json 填充选择选项

    我正在尝试动态填充ion select带有 json 对象的下拉列表 我的 html 组件如下所示
  • 适用于 Angular 2+ 的具有多个日期选择的日历

    我需要显示一个日历并让用户选择多个日期 例如2017 年 1 月 2 日 2017 年 1 月 3 日 2017 年 1 月 4 日 也就是说 不是一个范围 而是多个日期 在 Angular 1 x 中 我使用了gm datepickerM
  • Angular 显示每个 HTTP 请求的微调器,只需很少的代码更改

    我正在开发一个现有的 Angular 应用程序 版本是 Angular 4 该应用程序从许多不同的组件对 REST API 进行 HTTP 调用 我想为每个 HTTP 请求显示一个自定义微调器 由于这是一个现有的应用程序 因此有很多地方调用
  • 找不到模块“webpack”

    决定不在我的项目中使用 webpack 当我把它从package json出现以下错误ng s 找不到模块 webpack 错误 找不到模块 webpack 在 Function Module resolveFilename 内部 modu
  • 在 Angular 中使用异步管道设置选择元素的选定项目

    角度专家 我试图理解 Angular 中的异步管道 但我陷入了一个基本场景 我在用户界面中有两个选择元素 一个包含帖子 一个包含相关评论 我想将一个帖子 最后一个 设置为显示帖子的选择元素的最初选择的帖子 并且我想使用所选项目来过滤第二个选
  • 当`enableProdMode()`时到底发生了什么[重复]

    这个问题在这里已经有答案了 我正在与Angular2 quick start演示使用TypeScript 一切正常 但在演示完成后 我在浏览器控制台中看到一条消息 Angular 2 正在开发模式下运行 调用enableProdMode 启
  • 如何在 Angular 2 轮询服务中访问 .subscribe 之外的值

    我试图从订阅外部获取值 但它无法分配给任何变量 在我的项目中 使用 http post 方法获取 json 内容并将其分配给变量 我想在构造函数之外访问这些变量值 我怎样才能做到这一点 ngOnInit void this getSubsc

随机推荐

  • C# 管理窗口事件

    我想使用 C 从 Windows 事件日志中删除事件 谁能指出我如何实现这一目标的正确方向 Easy 但删除看起来像从数组中删除项目 您需要复制所有数组 但需要删除的项目除外 有一个示例 如何 从日志中删除项目具有非偶数索引的每个项目 us
  • 动画添加类/删除类?

    活生生的例子在这里 http timkjaerlange com foobar stack stuff august 18 2010 test html http timkjaerlange com foobar stack stuff a
  • 引用的项目在编译时“丢失”

    我有一个包含两个项目的 C 解决方案 一个服务 主项目 和一个记录器 该服务使用记录器中的类 我在服务项目中添加了对记录器项目的引用 在设计时 自动完成工作正常 记录器的类是可见的 我使用的引用具有适当的颜色 我重建解决方案 但出现问题 不
  • Firebase 错误地显示已删除的数据/Swift 3/Xcode 8.2

    我是编码新手 刚刚开始使用 Firebase 我正在运行以下函数 该函数基本上是尝试创建 2 个节点 锦标赛 和 每日游戏 如果它们尚不存在 数据库树应该如下所示 London City Game Date stringDate getti
  • PHP 正则表达式 [仅接受选定的字符]

    我想接受用户输入的字符列表并拒绝其余的 我可以接受格式化字 符串或查找是否缺少字符 字符串 但我如何才能只接受一组字符而拒绝所有其他字符 我想使用 preg match 来做到这一点 例如允许的字符有 a z A Z 用户必须能够以任何顺序
  • 使用 Google 的 Gson 进行严格的 JSON 解析?

    假设我正在使用 Google 的 Gson 库将 JSON 解析为 Java 数据结构 如果 Java 字段没有对应的 JSON 是否有简单的方法抛出异常 也就是说 我希望要求 JSON 具有 Java 结构中的所有字段 Gson 没有 J
  • JSLint 错误:将调用移至包含该函数的括号中

    我怎样才能让这个代码 jsLint 快乐 function window document undefined some code jQuery window document 它建议我这样写 会有什么不同吗 我该怎么办 function
  • 如何在 WPF 中的窗口上绘图(最佳实践)?

    我正在尝试编写一个类似交互式游戏的小型应用程序 我需要有一个Draw方法将在屏幕上绘制 但无法弄清楚如何构造 WPF 的方法 如果这是Winforms 我可以使用 public void Draw Graphics g 但对于一个WPF W
  • 我的 java 应用程序不读取我的文件(maven 项目)

    我有一个 Java 简单项目中的应用程序 但是 我需要将此项目粘贴到 Maven 项目中 因此 我基本上制作了一个简单的 Maven 项目 并将所有类复制并粘贴到其中 我需要在服务器中运行一个war 并且我需要像Java应用程序一样运行Ma
  • 从头开始创建 mp3 文件 C#

    作为一些实验的一部分 我想到了一些事情 如何在 C 中从头开始创建一个 mp3 文件 这实际上听起来像什么 例如 创建一个播放音符的 mp3 文件 C 或 B 降调 我怎样才能实现这一点 它必须是 mp3 文件 而不是 wav 或其他任何文
  • Python 寻求读取不断增长的文件

    我编写了一个 python 脚本 使用任务计划程序每 5 分钟运行一次 读取不断增长的日志文件 文本文件 并将数据插入数据库 每天生成新的日志文件 我需要修改它并在最后一行的末尾放置一个指针 因此当调度程序再次运行时 它会在最后插入的行之后
  • 普遍接受的变量名称格式 - C/C++

    我意识到这可能是一个偏好问题 但我注意到我见过的很多代码示例中的变量名称都有前缀g s m 要不就 这是一种普遍接受的做法吗 这些前缀的含义是什么 还有其他值得了解的吗 g 是一个全局变量 s 是一个静态的 m 是一个成员 实例变量 是成员
  • 如何在cocos2dx 3.0中调用callfunc函数

    我必须将 Objective C 转换为 C 11 我坚持使用以下语法 我已在 testcpp 中引用并尝试以下语法 这是我尝试过的代码 this gt runAction Sequence create blink CallFunc cr
  • Reset.css 在 IE7/IE6 中覆盖 colgroup 背景

    我有一个表 其中的列具有由 colgroup 设置的不同背景 然而 在 IE6 7 中 它完全忽略 colgroup 背景并采用单元格的 Reset css 背景值 即背景 透明 如何解决此问题 而无需转到每个单元格并手动输入背景值 HTM
  • 安装期间初始化 user.config 或 app.exe.config

    我正在开发一个 NET WinForms 应用程序 它依赖于 user config 来存储各种有用的设置 例如 Intranet Web 服务 URL 我们希望能够在安装过程中导入自定义初始设置 其用例是 如果一家公司想要在 100 台计
  • Spring Boot - 微服务之间如何通信?

    我目前正在开发一个 Spring Boot 微服务项目 我创建了服务 每个服务都单独运行 这样 我需要一些服务来与其他服务进行通信 我怎样才能做到这一点 我看到一些关于此的博客使用 Netflix Eureka 云服务器来实现这一点 有什么
  • mysql中auto_increment(整数)的限制是多少

    我有一个mysql数据库 我在其中使用auto increment integer 你能告诉我它可以增加多少整数吗 我们如何提高auto increment的限制 的极限auto increment column 是列的大小 https d
  • PHP / OpenCart 2.2.0 - 创建自定义主题

    我今天开始在 OpenCart 2 2 中进行主题开发 我正在关注这篇文章 http code tutsplus com tutorials create a custom theme with opencart introduction
  • 类型错误:“itertools.combinations”对象不可下标

    当我尝试运行时 temp twoset2 x i 0 twoset x i 1 I get 类型错误 itertools combinations 对象不可下标 My code for x in range 0 64 for i in ra
  • 如何在动态更新时检测输入的值变化(Angular 6)

    我正在使用自定义指令和自定义管道对文本输入进行货币格式化 它适用于任何类型的直接用户输入 焦点 模糊 按键 但是 当值动态更改时 我似乎无法捕获更改事件 我也找不到可靠的主机侦听器事件列表 并且不知道如何捕获进入输入的任何事件 因此无法看到