AngularJS Wie erzwingt man, dass eine Eingabe bei Unschärfe neu gerendert wird
Habe ich einige benutzerdefinierte Validierung code, umfasst eine $formatter. (I-store-Währung in pence für die Richtigkeit, aber die Anzeige in Pfund.pence.)
Wenn der Benutzer schreibt '10' in den Eingang (das ist ein Gültiger Wert), die Eingabe bleibt die Anzeige '10', nachdem Sie in das nächste Feld.
Ich würde es gerne anzeigen, 10,00 für die Konsistenz.
Wenn das Modell geändert, der Wert auf 1000, dann das Formatierungsprogramm würde das Feld '10.00'.
Möchte ich den formatter laufen auf dem Feld.blur() (so lange, wie die Eingabe gültig ist).
Mein problem ist, dass wenn ich den Modell-Wert von 10 zu 10, es gibt verständlicherweise keine Veränderung, und so ist das Feld nicht neu gerendert.
code:
var CURRENCY_REGEXP = /^\-?\d+(\.?\d?\d?)?$/;
app.directive('currency', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
ctrl.$parsers.unshift(function(viewValue) {
if (CURRENCY_REGEXP.test(viewValue)) {
//it is valid
ctrl.$setValidity('currency', true);
console.log("valid");
return viewValue * 100;
} else if (viewValue === '') {
return 0;
} else {
//it is invalid, return undefined (no model update)
ctrl.$setValidity('currency', false);
console.log("invalid");
return undefined;
}
});
ctrl.$formatters.push(function(modelValue) {
if (modelValue === 0) { //we're using integer pence, so this is safe
return '';
}
return (modelValue / 100).toFixed(2);
});
}
};
});
P. S. Das hat nichts zu tun mit Angular built-in "Währung".
Update: ich habe ein 'renderOnBlur" - Richtlinie, nach Andy ' s Antwort. Es wird aufgerufen, aber den Aufruf der render-Methode nicht re-Rendern Sie die Eingabe. also '10' bleibt wie '10', statt Sie direkt zu verändern, um '10.00', wie gewünscht.
(Wenn das Modell value-änderungen in diesen Bereichen sind Sie korrekt gerendert, wobei die 2 Nachkommastellen.)
Der Seite, die Andy erwähnt http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController sagt, dass Sie implementieren müssen, um $render
selbst. Das scheint komisch, da die Eingänge bereits richtig gerendert, wenn der Modell-Wert-änderungen.
app.directive('renderOnBlur', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attrs, ctrl) {
elm.bind('blur', function() {
console.log('rendering ctrl', ctrl);
ctrl.$render();
});
}
};
});
P. S. ich habe keine Ahnung, was restrict: 'A',
tut - es ist wahr, cargo-Kult-Programmierung am schlimmsten. Die require: 'ngModel',
scheint notwendig zum Auffüllen der ctrl
parameter.
Inspiriert durch die Antwort von @Dan Doyen, ich schrieb es so:
app.directive('renderOnBlur', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attrs, ctrl) {
elm.bind('blur', function() {
var viewValue = ctrl.$modelValue;
for (var i in ctrl.$formatters) {
viewValue = ctrl.$formatters[i](viewValue);
}
ctrl.$viewValue = viewValue;
ctrl.$render();
});
}
};
});
Dies hat den Vorteil, dass generische für jede $formatter, anstatt die Wiederholung der formatter-code wie in Dan ' s Antwort.
$formatter
, der Angular-Dokumentation steht, dass "Die Funktionen werden in umgekehrter array um, jeder übergibt den Wert bis zum nächsten." Die Richtlinie nennt Sie in der falschen Reihenfolge. Dachte nur ich würde beachten das für jemand anderes zu sein, als dieses etwas mich bei der Arbeit mit mehreren Formatierer. InformationsquelleAutor der Frage fadedbee | 2012-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Controller $modelValue wird korrekt aktualisiert, aber da der blur-Ereignis geschieht außerhalb von Winkel, es scheint Ihr $viewValue nicht. Wie wäre es damit?
InformationsquelleAutor der Antwort Dan Doyon
Ein wenig verbessert:
Nicht neu formatieren, wenn der Wert nicht gültig ist (in meinem Fall den ungültigen text gerade gelöscht auf blur, das ist schlecht für die usability, denke ich).
Auch, wie Dark Falcon sagte: Formatierer sollte rückwärts Durchlaufen werden.
Schließlich nicht zu iterieren über arrays mit for-in, zumindest nicht ohne überprüfung der hasOwnProperty () - (für mich der code ist abgestürzt, denn es behandelt-Array.find() als Formatierer).
InformationsquelleAutor der Antwort Stephen Friedrich
Einer alternativen Implementierung ist, um trigger-eckig - Formatierer. Eckige 1.5 Umsetzung Uhren $modelValue für Veränderungen und löst dann $Formatierer. Um dies manuell zu tun, kann man dies tun
Und dann in der Richtlinie
InformationsquelleAutor der Antwort Chui Tey
Versuchen Sie es mit ctrl.$Rendern deaktivieren.
elm.bind('blur', function() { ctrl.$render() });
Sehen es in http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController.
InformationsquelleAutor der Antwort Andrew Joslin
10.00 === 10
wahra=10.00
console.log(a)
10.00 nicht bedeutet, dass alles, was auf javascript, da diese Ihr 10,00 sind immer 10
Schlage ich vor, dass der Wert ein String, so können Sie das format, das Sie möchten
InformationsquelleAutor der Antwort Renan Tomal Fernandes