我想要拼接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被拼接,但在输入时停留在…
您正在尝试混合数据类型,并且得到不好的结果。
event.target.value
虽然你的代码样本不包括这一部分,我很确定你的事件是一个改变或输入事件从HTML<input type="text">
。对于大多数HTML输入类型,包括文本输入,该值的类型为String。
这意味着这段代码会给你不好的结果:
selectedNumber > 12
为什么?因为像>
和<
这样的不等式运算符通常应该只在两个操作数都是数字(或数字,如日期——其中不包括日期的字符串表示)时使用。只有在编写需要比较字符串的自定义排序函数时,才应该忽略此规则。在这个示例中没有排序,所以规则适用。
要解决这个问题,应该将原始值从String转换为实际的Number,如下所示:
let selectedNumber = parseInt(event.target.value)
(如果要处理小数,请使用parseFloat
)
- 不要使用
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应该始终存储为字符串)