Я пытаюсь написать маску ввода кода для форматирования номера телефона, например (123) 456-7890. Я почти закончил.
Я создал директиву для выполнения формата, но я застрял на операции вставки.
Если пользователь вводит номер телефона в текстовое поле, он работает нормально.
Но если пользователь скопирует и вставит телефонный номер 10 di git в текстовое поле, форматирование произойдет только в текстовом поле, не отраженном в привязке модели.
показ текстового поля -> (123) 456- 7890, но в ngModel bind равен 1234567890
Фактический код в StackBlitz
https://stackblitz.com/edit/angular-648zrp
Код
html шаблон
<form #myForm="ngForm">
<div>
<span>Copy and paste the below text in textbox </span>
<br>
<br>
<span>1234567890</span>
</div>
<hr>
<br>
<div>
<input name="phoneNumber" id="phoneNumber" class="form-control" phone autocomplete="off"
maxlength="14" (blur)="onSubmit()" [(ngModel)]="phoneNumber"/>
<br/>
<br/>
<span>PhoneNumber NgModel Bind : {{phoneNumber}}</span>
<br/>
<br/>
<span *ngIf="myForm?.controls?.phoneNumber">PhoneNumber form value : {{myForm.controls.phoneNumber.value}}</span>
</div>
</form>
Компонент
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
phoneNumber: string;
}
Директива
import { Directive } from '@angular/core';
import { NgControl } from '@angular/forms';
@Directive({
selector: '[ngModel][phone]',
host: {
'(ngModelChange)': 'onInputChange($event)'
}
})
export class MaskDirective {
constructor(public model: NgControl) {}
onInputChange(value) {
var x = value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
this.model.valueAccessor.writeValue(value);
}
}