javascript - FromGroup 中输入掩码的验证
问题描述
我得到了信用卡的例子FormGroup
,使用 Angular directive
,我input mask
为输入创建4444444444444444
了4444 4444 4444 4444
,但问题是我得到了不接受的正则表达式验证space
。这是我尝试过的,
ts.文件
{
this.creditCardForm = builder.group({
creditCardNumber: ['', [creditCardNumberValidators]]
});
}
}
function creditCardNumberValidators(c: FormControl) {
const isVisa = /^(?:4[0-9]{12}(?:[0-9]{3})?)$/;
return isVisa.test(c.value)
? null
: {
validateInput: {
valid: false,
},
};
}
@Directive({
selector: '[creditCardMask]',
})
export class CreditCardMaskDirective {
@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;
let trimmed = input.value.replace(/\s+/g, '');
if (trimmed.length > 16) {
trimmed = trimmed.substr(0, 16);
}
const numbers = [];
for (let i = 0; i < trimmed.length; i += 4) {
numbers.push(trimmed.substr(i, 4));
}
input.value = numbers.join(' ');
}
}
这是我的stackblitz 演示,根据我的发现,我可以有 2 个解决方案:
- 找到接受空格的正则表达式
- 使用and更改
creditCardNumber
值(删除空间),但问题是我不确定如何在将值填充到 FormGroup 进行验证之前更改值.replace(/\s/g, '')
.toString()
需要建议,如果有更好的做法来解决这个问题,谢谢
解决方案
使用您正在使用的相同正则表达式,但在验证之前从卡号中删除空格。
您可以使用String.split()和Array.join()来做到这一点。
function creditCardNumberValidators(c: FormControl) {
const isVisa = /^(?:4[0-9]{12}(?:[0-9]{3})?)$/;
// Remove spaces.
let cardNumber = c.value.trim().split(' ').join('');
return isVisa.test(cardNumber)
? null
: {
validateInput: {
valid: false,
},
};
}
String.replace()也可以用来删除空格。
let cardNumber = c.value.replace(/\s/g, '');
StackBlitz 上的现场演示: https ://stackblitz.com/edit/angular-reactive-forms-12jq6d
推荐阅读
- webpack - Webpack 没有编译全局样式
- javascript - D3 - 如何在数据值更改时更新力模拟
- powershell - 在powershell的键/值查找表中使用正则表达式?
- node.js - 使用 mongoClient 连接池连接不同的用户
- flutter - 试图将 DocumentID 从 ListView 传递给 ¨ Like ¨ 函数
- python - 循环通过两个单独的数据帧,Haversine 函数,存储值
- google-chrome - 控制台可以与网络面板交互吗?
- javascript - TypeError:这在 setstate reactjs 上未定义
- reactjs - 如何在`react-select`中禁用`deselect-option`?
- azure - 强制来自 Azure 静态网站的 200 个响应代码 - SPA(Google 不会索引路线)