Ich arbeite an einer Anwendung, die Änderungen automatisch speichert, wenn der Benutzer etwas ändert, zum Beispiel den Wert eines Eingabefeldes. Ich habe eine autosave
Direktive geschrieben, die zu allen Formularfeldern hinzugefügt wird, die Speicherereignisse automatisch auslösen sollten.Wie verwende ich den letzten gültigen ModelValue, wenn ein Modell ungültig wird?
Vorlage:
<input ng-model="fooCtrl.name" autosave>
<input ng-model="fooCtrl.email" autosave>
Richtlinie:
.directive('autosave', ['$parse', function ($parse) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
function saveIfModelChanged() {
// save object containing name and email to server ...
}
ngModel.$viewChangeListeners.push(function() {
saveIfModelChanged();
});
}
};
}]);
Bisher dies alles funktioniert gut für mich. Wenn ich die Validierung jedoch in den Mix einfüge, z. B. indem ich das Eingabefeld als gültige E-Mail-Adresse validiere, wird der Modellwert auf undefined
gesetzt, sobald der viewValue in eine ungültige E-Mail-Adresse geändert wird.
Was ich tun möchte, ist dies: Denken Sie an den letzten gültigen ModelValue und verwenden Sie dies beim automatischen Speichern. Wenn der Benutzer die E-Mail-Adresse als ungültig ändert, sollte das Objekt, das name
und email
enthält, weiterhin auf dem Server gespeichert werden. Mit dem aktuell gültigen name
und dem letzten gültigen email
.
Ich begann mit den letzten gültigen modelValue wie folgt zu speichern:
Vorlage mit Validierung hinzugefügt:
<input type="email" ng-model="fooCtrl.name" autosave required>
<input ng-model="fooCtrl.email" autosave required>
Richtlinie mit Spar lastModelValue:
.directive('autosave', ['$parse', function ($parse) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
var lastModelValue;
function saveIfModelChanged() {
// remeber last valid modelValue
if (ngModel.$valid) {
lastModelValue = ngModel.$modelValue;
}
// save object containing current or last valid
// name and email to server ...
}
ngModel.$viewChangeListeners.push(function() {
saveIfModelChanged();
});
}
};
}]);
Meine Frage ist, wie man lastModelValue
beim Speichern verwendet, aber vor den ungültigen Wert in der Ansicht servieren?
EDIT:
Eine weitere Möglichkeit, as suggested by Jugnu below würde Verpackung und den Bau in dem Validierer zu manipulieren.
Ich habe versucht, folgende: alle vorhandenen Validatoren wickeln und den letzten gültigen Wert erinnern, es wiederherstellen, wenn Validierungen fehlschlägt:
Object.keys(ngModel.$validators).forEach(function(validatorName, index) {
var validator = ngModel.$validators[validatorName];
ngModel.$validators[validatorName] = createWrapper(validatorName, validator, ngModel);
});
function createWrapper(validatorName, validator, ngModel){
var lastValid;
return function (modelValue){
var result = validator(modelValue);
if(result) {
lastValid = modelValue;
}else{
// what to do here? maybe asign the value like this:
// $parse(attrs.ngModel).assign(scope, lastValid);
}
return result;
};
}
Aber ich bin nicht sicher, wie entweder mit diesem Ansatz fortzusetzen. Kann ich den Modellwert ohne AngularJS einstellen und versuchen, diesen neu eingestellten Wert zu validieren?
Angesichts der Tatsache, dass Sie auch das Back-End Ihrer App entwickeln, würde ich in Betracht ziehen, das gesamte Problem in das Back-End auszulagern. Wenn das Backend zufällig node.js wäre, würde ich einfach diese Werte 'v' auf meine Datenbank aktualisieren, für die 'v! == undefined' gilt, und mir einige Arbeitsstunden sparen. Ich verstehe, dass Sie dies möglicherweise nicht tun können oder dieses Projekt zu Lernzwecken durchführen, nur meine Gedanken über Dev-Effizienz. –