使用 event.preventDefault() 时 Angular2 值未与模型绑定
Angular2 value is not binding with model while using event.preventDefault()
我已经创建了用于验证的输入指令。在那,我使用 event.preventDefault() 不允许按下键。
以下是我的代码:
<input class="input" maxlength="255" [(ngModel)]="chargeLabel" inputRestrictor pattern="^\w+( \w+)*$" singleSpace="false" />
输入指令代码:
export class InputRestrictorDirective {
@Input('inputRestrictor') inputRestrictor: any;
@Input('pattern') pattern: string;
@Input() singleSpace = 'true';
private regex: RegExp;
// Allow key codes for special events. Reflect :
// Backspace, tab, end, home
private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];
constructor(private el: ElementRef) {
}
@HostListener('keypress', ['$event']) onKeyPress(event) {
this.regex = new RegExp(this.pattern, 'g');
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
let inputValue: any = event.target.value + event.key;
if (inputValue.match(this.regex) === null && inputValue !== '') {
if (this.singleSpace === 'true') {
event.preventDefault();
return false;
} else {
inputValue = inputValue.replace(/\s\s+/g, ' ');
inputValue = inputValue.replace(/[^\w\s]/g, '');
event.target.value = inputValue;
event.preventDefault();
return;
}
} else {
return;
}
}
}
我的问题是,我在文本框中输入的任何值都没有存储在模型中,但如果我按退格键或 Tab 等特殊键,它将存储在模型中。意味着值与模型绑定。你能帮忙吗?
我找到了解决方案。我只需要将条件放在指令文件中。
if (inputValue.match(/\s\s+/g)) {
inputValue = inputValue.replace(/\s\s+/g, ' ');
inputValue = inputValue.replace(/[^\w\s]/g, '');
this.el.nativeElement.value = inputValue;
event.preventDefault();
return;
}
如果输入框中有任何双 space,我需要使用 preventDefault()。
我已经创建了用于验证的输入指令。在那,我使用 event.preventDefault() 不允许按下键。
以下是我的代码:
<input class="input" maxlength="255" [(ngModel)]="chargeLabel" inputRestrictor pattern="^\w+( \w+)*$" singleSpace="false" />
输入指令代码:
export class InputRestrictorDirective {
@Input('inputRestrictor') inputRestrictor: any;
@Input('pattern') pattern: string;
@Input() singleSpace = 'true';
private regex: RegExp;
// Allow key codes for special events. Reflect :
// Backspace, tab, end, home
private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];
constructor(private el: ElementRef) {
}
@HostListener('keypress', ['$event']) onKeyPress(event) {
this.regex = new RegExp(this.pattern, 'g');
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
let inputValue: any = event.target.value + event.key;
if (inputValue.match(this.regex) === null && inputValue !== '') {
if (this.singleSpace === 'true') {
event.preventDefault();
return false;
} else {
inputValue = inputValue.replace(/\s\s+/g, ' ');
inputValue = inputValue.replace(/[^\w\s]/g, '');
event.target.value = inputValue;
event.preventDefault();
return;
}
} else {
return;
}
}
}
我的问题是,我在文本框中输入的任何值都没有存储在模型中,但如果我按退格键或 Tab 等特殊键,它将存储在模型中。意味着值与模型绑定。你能帮忙吗?
我找到了解决方案。我只需要将条件放在指令文件中。
if (inputValue.match(/\s\s+/g)) {
inputValue = inputValue.replace(/\s\s+/g, ' ');
inputValue = inputValue.replace(/[^\w\s]/g, '');
this.el.nativeElement.value = inputValue;
event.preventDefault();
return;
}
如果输入框中有任何双 space,我需要使用 preventDefault()。