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);
            });
        }
    }
}]);
Mit der Art und Weise, die Sie definiert haben $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

Schreibe einen Kommentar