2013-07-01 14 views
7

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(); 
    } 
} 

risposta

10

Ah-ah, stavo solo calcolando la metà dell'equazione. Il $parsers si attiva quando l'input viene inviato dal DOM al modello. Avevo bisogno di aggiungere $formatters, che invia dati dal modello al DOM.

Dopo i $ parser, ho aggiunto il seguente:

ctrl.$formatters.unshift(function(value) { 
    var before = scope.$eval(attrs.validateBefore); 
    ctrl.$setValidity("validateBefore", before ? value <= before : true); 
    return value; 
}); 

Questo fa sì che la convalida al fuoco al momento il modello è cambiato. È discusso di più qui: http://docs.angularjs.org/guide/forms, e qui http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController#$formatters

+0

funziona? non innesca la convalida per me. – ovi

+0

funziona! @ovi, il campo modulo viene aggiunto alla classe css "ng-invalid", ma non "ng-dirty", dai un'occhiata. –

Problemi correlati