ho una direttiva di convalida personalizzato che uso per garantire sono due date in un intervallo valido. La direttiva funziona correttamente quando un utente modifica i valori, tuttavia non si attiva quando carico un nuovo modello lineItem
tramite AJAX.AngularJS trigger personalizzati formare validazione sul cambiamento del modello
Il problema è che un utente può immettere date non valide nel modulo e attivare l'errore, quindi caricare un altro elemento di riga. A questo punto, è presente un messaggio di errore nel modulo anche se i dati nel modulo sono validi.
Se provo la stessa cosa con la convalida integrata di Angular (come required
), la convalida si innesca e scompare in modo appropriato. Quindi, cosa devo fare per far scattare la mia validazione allo stesso modo di Angular?
(nota: sto usando novalidate
sul attributo form, e v1.1.5 angolare)
DIRETTIVA
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;
}
});
}
}
});
MODELLO
<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();
}
}
funziona? non innesca la convalida per me. – ovi
funziona! @ovi, il campo modulo viene aggiunto alla classe css "ng-invalid", ma non "ng-dirty", dai un'occhiata. –