Ich verwende ngChange in AngularJS, um eine benutzerdefinierte Funktion auszulösen, die alle Buchstaben entfernt, die der Benutzer der Eingabe hinzufügt.
<input type="text" name="inputName" data-ng-change="numbersOnly()"/>
Das Problem ist, dass ich auf die Eingabe abzielen muss, die ausgelöst wurde, numbersOnly()
damit ich die eingegebenen Buchstaben entfernen kann. Ich habe lange und intensiv bei Google gesucht und konnte diesbezüglich nichts finden.
Was kann ich tun?
javascript
angularjs
angularjs-directive
Chris Bier
quelle
quelle
Antworten:
Verwenden Sie auf einfache Weise type = "number", wenn dies für Ihren Anwendungsfall funktioniert:
Ein weiterer einfacher Weg: ng-pattern kann auch verwendet werden, um einen regulären Ausdruck zu definieren, der die zulässigen Felder einschränkt. Siehe auch die Seite "Kochbuch" über Formulare .
Hackisch? Art und Weise , beobachten $ ng-Modell in Ihrem Controller:
Regler:
Verwenden Sie am besten einen $ parser in einer Direktive. Ich werde die bereits gute Antwort von @ pkozlowski.opensource nicht wiederholen. Hier ist der Link: https://stackoverflow.com/a/14425022/215945
Bei allen oben genannten Lösungen wird das ng-Modell verwendet, wodurch das Auffinden
this
unnötig wird.Die Verwendung von ng-change führt zu Problemen. Siehe AngularJS - Zurücksetzen von $ scope.value ändert den Wert in der Vorlage nicht (zufälliges Verhalten)
quelle
type=number
wird automatisch der Spinner angezeigt, was möglicherweise unerwünscht ist. Sie können den Spinner über CSS ausblenden, aber auch das funktioniert möglicherweise nicht in allen Browsern.Verwenden
ng-pattern
des Textfelds:Fügen Sie dies dann Ihrem Controller hinzu
quelle
Keine der vorgeschlagenen Lösungen hat für mich gut funktioniert, und nach ein paar Stunden fand ich endlich den Weg.
Dies ist die Winkelrichtlinie:
Und die Eingabe würde so aussehen:
Der reguläre Ausdruck wertet die gedrückte Taste aus, nicht den Wert .
Es funktioniert auch perfekt mit Eingaben,
type="number"
da verhindert wird, dass sich sein Wert ändert, sodass der Schlüssel nie angezeigt wird und das Modell nicht beeinträchtigt wird.quelle
restrict-to="[0-9\-]"
Hier ist meine Implementierung der
$parser
Lösung, die @Mark Rajcok als beste Methode empfiehlt. Es ist im Wesentlichen @ pkozlowski.opensources ausgezeichneter $ Parser für Textantworten, der jedoch neu geschrieben wurde, um nur Zahlen zuzulassen. Alle Ehre gebührt ihm. Dies dient nur dazu, Ihnen die 5 Minuten des Lesens dieser Antwort und des anschließenden Umschreibens Ihrer eigenen zu ersparen:Und du würdest es so benutzen:
Interessanterweise erreichen Leerzeichen den Parser nur, wenn sie von einer alphanumerischen Zahl umgeben sind
.trim()
. Sie müssen dies also nach Bedarf tun . Auch dieser Parser ist nicht arbeiten<input type="number">
. Aus irgendeinem Grunde, nicht-numerische Werte machen es nie an den Parser , wo sie entfernt werden würde, aber sie tun es in die Eingangskontrolle selbst.quelle
var transformedInput = inputValue ? inputValue.replace(/[^\d.-]/g,'') : null;
ng-trim
umfalse
um sicherzustellen , dass Räume erreichen Ihre Parser zu machen.modelCtrl.$commitViewValue();
zwischen $ setViewValue (clean) hinzufügen ; und $ render ();Es gibt einige Möglichkeiten, dies zu tun.
Sie könnten verwenden
type="number"
:Alternativ - Ich habe dafür eine wiederverwendbare Direktive erstellt , die einen regulären Ausdruck verwendet.
Html
Javascript
quelle
Hier ist eine ziemlich gute Lösung, um nur die Eingabe der Nummer zuzulassen
input
:quelle
Alle oben genannten Lösungen sind ziemlich groß, ich wollte meine 2 Cent dafür geben.
Ich überprüfe nur, ob der eingegebene Wert eine Zahl ist oder nicht, und ob er nicht leer ist, das ist alles.
Hier ist das HTML:
Hier ist der JS:
Es ist ganz einfach.
Ich glaube, das wird bei Paste tho nicht funktionieren, nur damit es bekannt ist.
Ich denke, für Paste müssten Sie das onChange-Ereignis verwenden und den gesamten String analysieren, ein ganz anderes Biest, das Tamme. Dies ist spezifisch für die Eingabe.
UPDATE zum Einfügen : Fügen Sie einfach diese JS-Funktion hinzu:
Und die HTML-Eingabe fügt den Auslöser hinzu:
Ich hoffe das hilft o /
quelle
Hier ist ein Plunker , der jede Situation behandelt, die über dem Vorschlag nicht behandelt wird.
Durch Verwendung der Pipeline $ formatters und $ parsers und Vermeidung von type = "number"
Und hier ist die Erklärung der Probleme / Lösungen (auch im Plunker verfügbar):
quelle
Sie können nur numerische Attribute verwenden.
quelle
DEZIMAL
Ziffern
Winkelanweisungen zum Validieren von Zahlen
quelle
Ich weiß, dass dies alt ist, aber ich habe eine Richtlinie für diesen Zweck erstellt, falls jemand nach einer einfachen Lösung sucht. Sehr einfach zu bedienen.
Sie können es hier überprüfen .
quelle
Vielleicht möchten Sie auch die 0 am Anfang der Eingabe entfernen ... Ich füge einfach einen if-Block zur obigen Mordred-Antwort hinzu, da ich noch keinen Kommentar abgeben kann ...
quelle
Versuche dies,
quelle
LÖSUNG: Ich mache eine Anweisung für alle Eingaben, Zahlen, Texte oder andere in der App, damit Sie einen Wert eingeben und das Ereignis ändern können. Machen Sie für Winkel 6
HTML
quelle
Am Ende habe ich eine modifizierte Direktive des obigen Codes erstellt, um Eingaben zu akzeptieren und das Format im laufenden Betrieb zu ändern ...
})
quelle
quelle
Grundlegendes HTML
Grundlegender Bootstrap
quelle
<input class="form-control" type="number" >