angular4中ngModel双向绑定在限制输入情况下与value值不一致的问题及尝试的解决方法

2023-10-27

近期公司的一个后台项目在使用angular4进行开发,随着项目的推进和迭代开发,需要对有的input框的value值进行限制输入,例如目前项目的一些input框只允许输入数字和'.' 这两种形式的内容。就在input标签的中添加了(keyup)属性,将相应的ts文件中编写的一个正则验证方法赋值给该属性,以便进行验证,如下所示:

<input type="text" #price [(ngModel)]="normal.price" (keyup)="numTest($event)">元/次 {{normal.price}} ||| {{price.value}}

numTest($event){
   $event.target.value = $event.target.value.replace(/[^\d]/g, '');
}
开始以为这样的正则是没有问题的,但是通过实践发现,该方法有一定局限性。在打开中输入法的时候,当键入汉字并使用Space键或者Enter键或者鼠标左键选择输入法罗列的汉字时,该正则对input的value值是有效果的,但是对双向绑定的“normal.price”是不起作用的。在页面显示的
normal.price -> 你好 ||| price.value -> ''(在页面是不显示price.value的值的,因为通过正则,已经将该值置为空了,这里用''表示)

初次遇到这个问题,感觉有些奇怪,印象里在angularjs的使用过程中并没有出现同样的问题,虽然angular2之后使用TypeScript重新编写了框架,但是双向绑定这个亮点还是保留的,不应该出现这样的不一致才对。随后查看了angular的文档,在核心知识->模板和数据绑定->模板语法中找到了相关的表述:

表述

从该表述中获知,双向绑定的实现是模仿input标签中的[value]、[input]两个属性来实现值的变化的。于是就暂时先弃用双向绑定的便利写法,回归原始:

input type="text" #price [value]="normal.price" (input)="normal.price=$event.target.value" (keyup)="numTest($event)">元/次 {{normal.price}} ||| {{price.value}}
 但结果跟使用双向绑定的效果一样,normal.price的值依然没有进行有效的正则过滤。对此更加疑惑不解,在网上好像也没能寻求到相同问题的解决办法。

这个问题搞了一下午还是没有什么起色,到了第二天,可能是换了换脑子的缘故,重新梳理了一下这个问题,决定将这个问题分两步,分别解决:1、怎么禁止中文输入法的使用,不能将键入选择的汉字输入到input框中;2、怎么同步[(ngModel)]的属性值与input的value值完全同步的问题。

有了这样的思路后,首先着手看怎么禁止中文输入法,这个网上有好多,相对能找到一些有价值的参考。找到了这篇文章:

input 事件与汉字输入法:使用compositionend事件解决发现了“compositionend“这个属性。查看了MDN中关于compositionend 属性的解释:

查看了翻译后的文本,当然解释不一定完全符合原意,有在网上查找了该属性的一些用法,一般是对input属性的补充。用于监听文本的输入,对中文输入法起作用。至此,对于第一个问题的解决就有了思路:
<input type="text" #price [(ngModel)]="normal.price" (compositionend)="$event.target.value= ''" (keyup)="numTest($event)">元/次 {{normal.price}} ||| {{price.value}}
这样,当中文输入法键入汉字时,input框的value值会强制置空,根据这样的思路,同时再强制双向绑定的值,也是可行的。
第一个问题解决之后,就着手开始第二个问题的处理,怎样使normal.price同input的value值保持一致,由于始终没有完全理清ngModel的实现原理,且还原成原始的value和input属性后效果相同,在不得已的情况下,又在input标签中添加了一个属性ngModelChage,将带有正则验证方法的返回值重新赋值给ngModel的属性值。这样问题二也能够间接的解决掉。并且配合前边的compositionend属性,使页面表现同数据的赋值相一致。
最终的结果是这样子的:
<input type="text" #price [(ngModel)]="normal.price" (ngModelChange)="normal.price=numTestValue($event)" (compositionend)="$event.target.value= ''" (keyup)="numTest($event)">元/次 {{normal.price}} ||| {{price.value}}
 clearNoNum11($event) {
    $event = $event.replace(/[^\d]/g, '');
    return $event;
  };
这样,算是解决了在有输入限制的情况下,input框的value值与双向绑定的值不一致的问题。当然,这里的解决方案并不是最终、最简便的,待以后对angular4有更深入的理解后,再进行方法的补充和提炼吧!
Ps: 这里还有一个疑惑,在angular技术文档中
<input [value]="currentHero.name" (input)="currentHero.name=$event.target.value" > 的对应anglar写法是
<input [ngModel]="currentHero.name" (ngModelChange)="currentHero.name=$event">
但是在ngModelChage的$event直接就是该input框的value,而不是通常认为的event事件对象。在这里注明一下,有待后续学习理解。


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

angular4中ngModel双向绑定在限制输入情况下与value值不一致的问题及尝试的解决方法 的相关文章

随机推荐

  • Date类、LocalDate类基本操作

    Date类和LocalDate类 Date类用来表示时间点 LocalDate类是作为日历表示法的类 示例 package riqi test import java time LocalDate import java util Date
  • 老人防跌倒报警系统,及时防止跌倒给老人带来的伤害-新导智能

    跌倒是我国65岁以上老年人因伤害逝世的主要原因 据统计 老年人产生伤口性骨折的主要原因是跌倒 年龄越大 产生跌倒及因跌倒而受伤或逝世的危险越高 在老年人居家生活 外出活动和机构养老中 苏州新导推出的防老人跌倒系统需求综合采取适老化改造 自我
  • 测试用例设计方法---流程图法

    学习目标 掌握流程图法的适用范围 1 什么是流程图法 流程分析法主要是针对测试场景类型属于流程测试场景的测试项下的测试子项进行设计 2 流程图法设计测试用例步骤 第一步 详细了解需求 第二步 根据需求说明或界面原型 找出业务流程的各个页面以
  • 目标检测YOLO实战应用案例100讲-智能目标检测系统在FPGA中的设计与实现

    目录 基于FPGA的目标检测系统的设计与实现 深度学习硬件加速技术研究现状 相关理论与技术概述
  • Parent name: cv2.cv2. Submodule name: cv2

    Bindings generation error Submodule name should always start with a parent module name Parent name cv2 cv2 Submodule nam
  • js ajax 传输list,jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签...

    废话不多说了 直接给大家贴代码了 具体内容如下所示 js function myBtn f var cnt myCnt val syncAjax myAjax html cnt cnt function result if 100 resu
  • sklearn中digits手写字体数据集介绍

    1 导入 from sklearn import datasets digits datasets load digits 2 属性查看 digits bunch类型 print digits keys images data target
  • 【Docker实战】使用Docker部署Tomcat

    Docker实战 使用Docker部署Tomcat 一 Tomcat介绍 1 Tomcat简介 2 Tomcat特点 3 Tomcat容器部署的优点 4 Tomcat的配置文件 二 检查本地环境 三 检查本地Docker环境 1 检查本地D
  • VLAN虚拟局域网

    一 虚拟局域网 VLAN Virtual Local Area Network 定义 VLAN 是一种将局域网内的设备逻辑地划分成一个个网段从而实现虚拟工作组的技术 VLAN 能够隔离广播域 VLAN 内的主机之间可以直接通信 而 VLAN
  • “Argument list too long”解决方法

    1 背景 Linux下使用cp mv rm等命令时经常会碰到 Argument list too long 错误 这主要是因为这些命令的参数太长 即文件个数过多 2 解决方案 Argument list too long 这个问题的解决主要
  • 升压电路(BOOST)与降压电路(BUCK)

    一 电路中产生电流的条件是 1 电路里必须有电源供电 2 电路必须形成闭合回路 降压元器件 升降压电路构成的核心元器件 1 电感 储存能量 电感是无法突变的 工作状态是线性的 2 二极管 3 mos管 首先先分清楚mos是N mos还是P
  • 真题详解(归并)-软件设计(五十三)

    真题详解 UML部署图 软件设计 五十二 https blog csdn net ke1ying article details 130233656 语句覆盖 lt 判定覆盖 lt 条件覆盖 lt 路径覆盖 2 ISO IEC 9126软件
  • 互联网支付系统整体架构详解(转)

    https www cnblogs com zhjh256 p 6763978 html 在互联网产品运营中 有很多小伙伴或许会遇到这样的困扰 产品好不容易推出来了 流量成本节节攀升 用户的活跃度 留存度却持续下降 因此在瞬息万变的互联网产
  • tomcat和nginx的日志记录请求时间

    当系统卡顿时候 我们需要分析时间花费在哪个缓解 项目的后端接口可以记录一些时间 此外 在我们的tomcat容器和nginx网关上也可以记录一些有关请求用户 请求时间 响应时间的数据 可以提供更多的信息以便于排查问题 1 tomcat日志 s
  • 2022十四届蓝桥杯校赛题解(Python大学组)

    2022十四届蓝桥杯校赛题解 Python大学组 填空题 二进制2022 经历天数 考查datetime库 16进制数 优先动态规划 不同质数查找 编程题 拷贝问题 筛选重复单词 回文串 图形动态规划 交换代价问题 附录 常见方法 考试直接
  • Linux统计代码量命令cloc

    记录一下Linux中一个非常好用的代码量统计命令 cloc 安装步骤 sudo apt get install cloc 使用方法 进入到要统计的工程根目录 cloc 运行结果
  • 【以太坊源码】mpt实现

    转载自 click here trie encoding go encoding go主要处理trie树中的三种编码格式的相互转换的工作 三种编码格式分别为下面的三种编码格式 KEYBYTES encoding这种编码格式就是原生的key字
  • C语言字符串及其函数

    C语言中没有类似于C 或Java中的string类型 如果要在C中表示字符串 可用字符数组的形式 数组的概念可戳此链接了解 在C 中 string类库可以更简单的表示和使用字符串 可戳此链接了解string类 C语言中字符串是以空字符 0结
  • FRP中安全地暴露内网服务

    导读 之前的教程介绍的frp内网穿透都是用tcp模式 但是tcp模式是直接把端口映射到公网IP上 很容易被扫描爆破 还是存在一定的风险 我们可以使用frp提供的stcp模式来避免公开暴露端口 同时访问者也要运行一个frpc作为接收转发 fr
  • angular4中ngModel双向绑定在限制输入情况下与value值不一致的问题及尝试的解决方法

    近期公司的一个后台项目在使用angular4进行开发 随着项目的推进和迭代开发 需要对有的input框的value值进行限制输入 例如目前项目的一些input框只允许输入数字和 这两种形式的内容 就在input标签的中添加了 keyup 属