Wie beschränke ich das Telefonnummernfeld auf 10 Zeichen? Verwenden Sie "angle2 .". Ich habe versucht, ng-maxlenth zu verwenden, aber es funktioniert nur im Browser, aber nicht in den Android-Geräten.
Ich habe ein Code-Snippet mit Winkel 1 gefunden. Aber wie schreibe ich den gleichen Code mit Winkel2 neu?
app.directive("limitTo", [function() {
return {
restrict: "A",
link: function(scope, elem, attrs) {
var limit = parseInt(attrs.limitTo);
angular.element(elem).on("keypress", function(e) {
if (this.value.length == limit) e.preventDefault();
});
}
}
}]);
<input limit-to="4" type="number" class="form-control input-lg" ng-model="search.main" placeholder="enter first 4 digits: 09XX">
In Angle2 wird es so aussehen:
@Directive({
selector: '[limit-to]',
Host: {
'(keypress)': '_onKeypress($event)',
}
})
export class LimitToDirective {
@Input('limit-to') limitTo;
_onKeypress(e) {
const limit = +this.limitTo;
if (e.target.value.length === limit) e.preventDefault();
}
}
Vergessen Sie nicht, die Direktive in NgModule
sth zu registrieren:
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, LimitToDirective ],
bootstrap: [ App ]
})
export class AppModule {}
Und dann verwenden Sie es wie:
<input limit-to="4" type="number" placeholder="enter first 4 digits: 09XX">
Hier ist der Plunker!
Anstelle einer benutzerdefinierten Direktive können Sie einfach das maxlength
-HTML-Attribut und die attr-Bindung aus Angular 2 wie folgt verwenden: [attr.maxlength]="4"
<ion-input type="text" [(ngModel)]="a.myInput" [attr.maxlength]="4"></ion-input>
Sie können dieses Attribut auch von Ihrer Komponente aus an eine Eigenschaft binden, um die maximale Länge dynamisch festzulegen. Bitte werfen Sie einen Blick auf diesen Plunker.
Verwenden Sie einfach Slice:
{{expression | slice:begin:end}}
Angular DOCS: https://angular.io/docs/ts/latest/cookbook/ajs-quick-reference.html
Die @yurzui-Lösung funktionierte auf Android-Geräten nicht. Das Keypress-Ereignis wird aus bestimmten Gründen nicht ausgelöst, wie von @Jagadeesh erwähnt. Es gibt auch Probleme beim Aktualisieren gebundener Daten durch ngModel.
Ich empfehle stattdessen diese Lösung:
import {Directive, Input, Output, EventEmitter} from '@angular/core'
@Directive({
selector: '[limit-to]',
Host: {
'(input)': 'onInputChange($event)',
}
})
export class LimitToDirective {
@Input('limit-to') limitTo;
@Output() ngModelChange:EventEmitter<any> = new EventEmitter();
oldValue: any;
onInputChange(e){
const limit = +this.limitTo;
if(e.target.value.length > limit) {
e.target.value = this.oldValue;
}
this.oldValue = e.target.value;
this.ngModelChange.emit(e.target.value);
}
}
Überprüfen Sie beim Eingabeereignis die Länge des aktuellen Eingabewertes. Wenn er den Grenzwert überschritten hat, ersetzen Sie ihn durch den zuletzt gespeicherten alten Wert und aktualisieren Sie dann den angezeigten Textwert der Eingabe. und lösen Sie ein neues ngModelChange -Ereignis aus, um die gebundene Eigenschaft zu aktualisieren.
Ich habe ein ähnliches Problem in ionic2/angle2 auf Samsung Android-Geräten gesehen. Ich habe die benutzerdefinierte Direktive geschrieben, um dies zu behandeln. Dasselbe wurde in meinem Blog erwähnt und die dort genannten Verwendungshinweise . http://jagadeeshmanne.blogspot.in/2017/08/ionic-2-angular-maxlength-issue-in.html
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { Platform } from "ionic-angular";
@Directive({
selector: '[cMaxLength]'
})
export class MaxLengthDirective {
@Input('cMaxLength') cMaxLength:any;
@Output() ngModelChange:EventEmitter<any> = new EventEmitter();
constructor(public platform: Platform) {
}
//keypress event doesn't work in ionic Android. the keydown event will work but the value doesn't effect until this event has finished. hence using keyup event.
@HostListener('keyup',['$event']) onKeyup(event) {
const element = event.target as HTMLInputElement;
const limit = this.cMaxLength;
if (this.platform.is('Android')) {
const value = element.value.substr(0, limit);
if (value.length <= limit) {
element.value = value;
} else {
element.value = value.substr(0, limit-1);
}
this.ngModelChange.emit(element.value);
}
}
@HostListener('focus',['$event']) onFocus(event) {
const element = event.target as HTMLInputElement;
if (!this.platform.is('Android')) {
element.setAttribute('maxlength', this.cMaxLength)
}
}
}
basierend auf @yurzui eckig 4/5 umfassendere Lösung min, max. Attribute + Bugfix zum Löschen
import {Directive, ElementRef, HostListener, Input, OnInit, Renderer} from '@angular/core';
@Directive({
selector: '[appMaxDigits]'
})
export class MaxDigitsDirective implements OnInit {
@Input('appMaxDigits') appMaxDigits;
constructor(private renderer: Renderer, private el: ElementRef) {}
@HostListener('keydown', ['$event']) onKeydown(e: any) {
const limit = +this.appMaxDigits;
if (e.keyCode > 47 && e.keyCode < 127) {
if (e.target.value.length === limit) { e.preventDefault(); }
}
}
ngOnInit() {
this.renderer.setElementAttribute(this.el.nativeElement, 'min', '0');
this.renderer.setElementAttribute(this.el.nativeElement, 'max', '9'.repeat(this.appMaxDigits));
}
}