(keyup)在尝试拼接event.target.value时不起作用



我想要拼接number if is value>12 . but not work.

public preventNum(e){ 
let selectedNumber = e.target.value; 
if (selectedNumber > 12) { 
selectedNumber = selectedNumber.slice(0, 1) 
}
else {
console.log('else')
} 
}

<timepicker  
[(ngModel)]="selectedTime"  
(keyup)="preventNum($event)" >

为什么不工作?当我console.log selectedNumber的数字被拼接,但值在输入停留。

如果示例输入15,我想拼接到1个数字…

我也尝试拼接selectedTime,但那是日期类型,不能应用拼接日期。

selectedNumber被拼接,但在输入时停留在…

您正在尝试混合数据类型,并且得到不好的结果。

  1. event.target.value

虽然你的代码样本不包括这一部分,我很确定你的事件是一个改变或输入事件从HTML<input type="text">。对于大多数HTML输入类型,包括文本输入,该值的类型为String。

这意味着这段代码会给你不好的结果:

selectedNumber > 12

为什么?因为像><这样的不等式运算符通常应该只在两个操作数都是数字(或数字,如日期——其中不包括日期的字符串表示)时使用。只有在编写需要比较字符串的自定义排序函数时,才应该忽略此规则。在这个示例中没有排序,所以规则适用。

要解决这个问题,应该将原始值从String转换为实际的Number,如下所示:

let selectedNumber = parseInt(event.target.value)

(如果要处理小数,请使用parseFloat)

  1. 不要使用slice

作为一个实际问题,遵循我的第一个建议将迫使您停止使用slice,因为Numbers没有slice方法。

正确的修复取决于你想要完成什么,我不确定你的目标是什么。

对代码示例的仁慈解释是:"如果数字大于12,只保留最有效的数字。">

你的代码样本的其余部分向我暗示,你正在尝试做与12小时时钟相关的数学,这使我认为我刚才描述的逻辑不是唯一的,甚至不是最好的方法来完成你的目标。

我有一种预感,你想要做的是弄清楚用户给你的时间是在中午之前还是之后。如果这是正确的,那么这样做会使代码更清晰,数据设计更好:

let isMorning = selectedNumber < 12
let isAfternoon = selectedNumber >= 12

如果我误解了你的目标,你可以更详细地解释你的目标。


通常还有一个注意事项:仔细选择数据类型。Javascript提供了相当多的基本数据类型:字符串、数字、日期和布尔值。您必须决定如何表示应用程序所需的数据。如果您选择与您想要的数据最接近的逻辑匹配的本机数据类型,您将始终获得最佳结果。

为了说明我的观点,这里有一些非常糟糕的想法的例子;永远不要做以下任何一件事:

  • 将是/否值存储为字符串,1= yes和0= no(布尔值是正确的选择)
  • 将数量存储为字符串,如let sheepCount = "5"(Number是正确的选择)
  • 将对象ID存储为数字,即使它是全数字,如rowId = 5(在Javascript中,ID应该始终存储为字符串)

最新更新