AngularJS number format filter Richtlinie für die Eingabe mit NgModel
Ich möchte erstellen Sie eine Richtlinie für ein Eingabe-Steuerelement, das formatiert eine Zahl mit X Anzahl der Dezimalstellen, wenn die Eingabe nicht den Fokus haben. Wenn der Eingang nicht aktiv ist, möchte ich die Anzahl zu erscheinen unformatiert (keine Kommas).
Ich bin fast da, mit dem folgenden code. Wenn Sie klicken Sie in der Eingabe, der text ändert sich, und wenn Sie auf aus (blur-Ereignis) die text-Formate wieder. Jedoch, wenn ich den Wert in der Eingabe, dann die Ereignisse scheinen zu Runde ändern, und das blur-event bringt nichts. Dann klicken Sie in das Feld "Eingabe" wieder, die Wert-Formate, wenn es sollte, und das blur-Ereignis unformats, als Sie sollten-format.
Verwenden Sie die Richtlinie, die Sie kann einfach nicht
<input number-format ng-model="myValue" decimals="numberOfDecimals" />
Hier ist die Richtlinie
App.directive('numberFormat', ['$filter', '$parse', function ($filter, $parse) {
return {
require: 'ngModel',
link: function (scope, element, attrs, ngModelController) {
var decimals = $parse(attrs.decimals)(scope);
ngModelController.$parsers.push(function (data) {
//convert data from view format to model format
return $filter('number')(data, decimals); //converted
});
ngModelController.$formatters.push(function (data) {
//convert data from model format to view format
return $filter('number')(data, decimals); //converted
});
element.bind('focus', function () {
element.val(ngModelController.$modelValue);
});
element.bind('blur', function () {
element.val(ngModelController.$viewValue);
});
}
}
}]);
$parsers
wird die Richtlinie zu speichern formatierter zahlen zum Modell (d.h., wenn Sie in 123456
, $modelValue
wird als 123,456
, die endet als ein string) jedes mal, wenn Sie Bearbeiten das zugehörige Eingabefeld ein. Anstelle der Verwendung von $parsers
und $formatters
, warum nicht der Ansicht, eine $watch()
auf der Modell-Wert statt?Ich bin nicht sicher, hinzufügen von ein watcher ist die beste Idee. Ich weiß nicht wie der Gedanke an eine zusätzliche watcher für jede Instanz der Direktive. Ich hätte vielleicht 50 davon auf dem Bildschirm. 50 extra-watchers klingt nicht gut. Muss in der Lage sein, dies zu tun, ohne ein watcher.
Gut, wenn Sie darauf bestehen, hier ist eine geringfügige änderung, die sollten den trick tun. Sie sagen nichts über die Validierung des Modells, so dass ich davon ausgehen, du bist OK mit der Verwaltung, plnkr.co/Bearbeiten/wSflQs9bXYvihL5jUrvc?p=Album Vorhören
Vielen Dank für die änderung, ich dachte die $parser ändern musste parseFloat verwenden, aber nicht die Unschärfe ändern, also danke. Aber jetzt haben Sie mir besorgt, mit dem Kommentar "Du dont sagen nichts über die Modell-Validierung..." Auch ich möchte mit ng-benötigt, so dass ich vermute, das ist in Ordnung?
Kein problem, froh, dass es geholfen hat. Durch Validierung, meinte ich zu, wie Sie sich mit Benutzer setzen in albern Werte in das Eingabefeld ein. Ich aktualisierte mein Plunker mit einem groben Beispiel, was möchten Sie vielleicht zu tun (plnkr.co/Bearbeiten/wSflQs9bXYvihL5jUrvc?p=Album Vorhören). Sie können dann verwenden Sie die style-Klasse
ng-invalid
oder überprüfen ngModelController.$invalid
.InformationsquelleAutor Gillardo | 2014-11-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diskussion in der Frage Kommentare erschienen, haben dazu beigetragen, den OP.
$parsers
war, die user-specified input-Werte gespeichert werden, um das Modell Wert als filter format. Zum Beispiel, wenn123456
eingegeben wurde, werden die zugrunde liegenden Modell-Wert festgelegt werden würde, um123,456
. Der Punkt hier ist, dass das Modell Wert sein sollte, das speichern der raw user input, nicht die Eingabe des Benutzers nach der Formatierung angewendet wird. Eine einfache Implementierung zum Parsen der Benutzereingaben für$parsers
wäre, die NutzungparseFloat()
:Sicher zu sein, dieses parsing-Funktion sollte verbessert werden, um Platz für schlechte Benutzer-Eingabe. Ich habe ein rudimentäres Beispiel, das in meiner demonstration Plunker.
Deaktivieren, den Wert im input-Feld sollte gesetzt werden, um die gefilterte version des Modells Wert.
DEMO
Funktioniert wie Magie! vielen Dank 🙂
InformationsquelleAutor miqh