Ich habe eine benutzerdefinierte Validierung Direktive, die ich verwende, um sicherzustellen, dass zwei Daten innerhalb eines gültigen Bereichs sind. Die Anweisung funktioniert einwandfrei, wenn ein Benutzer die Werte ändert, jedoch nicht, wenn ich ein neues lineItem
Modell über AJAX einlege.Trigger benutzerdefinierte AngularJS Form Validierung bei Modellwechsel
Das Problem ist, dass ein Benutzer ungültige Daten in das Formular eingeben und den Fehler auslösen konnte, laden Sie dann ein anderes LineItem. An dieser Stelle gibt es eine Fehlermeldung auf dem Formular, obwohl die Daten im Formular gültig sind.
Wenn ich das gleiche mit Angulars eingebauter Validierung (wie required
) versuche, löst die Validierung aus und verschwindet entsprechend. Also, was muss ich tun, damit meine Validierung auf die gleiche Weise wie Angulars ausgelöst wird?
(Anmerkung: Ich verwende novalidate
auf dem Formular Attribut und Angular v1.1.5)
RICHTLINIE
ngApp.directive("validateBefore", function() {
return {
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
ctrl.$parsers.unshift(function(value) {
var before = scope.$eval(attrs.validateBefore);
if(value <= before || !before) {
ctrl.$setValidity("validateBefore", true);
return value;
} else {
ctrl.$setValidity("validateBefore", false);
return undefined;
}
});
}
}
});
TEMPLATE
<div class="date-group">
<span class="date">
<input type="text" class="input-medium" name="starts-at" ng-model="lineItem.startsAt" placeholder="From..." validate-before="lineItem.endsAt">
</span>
<span class="date">
<input type="text" class="input-medium" name="ends-at" ng-model="lineItem.endsAt" placeholder="To..." validate-after="lineItem.startsAt">
</span>
</div>
CONTROLLER
var lineItem = LineItem.get({ id: lineItemId }, function() {
$scope.lineItem = lineItem;
if($scope.lineItemForm) {
$scope.lineItemForm.$setPristine();
}
}
funktioniert das? es löst die Validierung für mich nicht aus. – ovi
es funktioniert! @ovi, das Formularfeld wird mit der CSS-Klasse "ng-invalid" angehängt, aber nicht "ng-dirty", suchen Sie danach. –