2013-07-01 15 views
7

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

Antwort

10

Ah-hah, ich war nur für die Hälfte der Gleichung verantwortlich. Die $parsers wird ausgelöst, wenn die Eingabe vom DOM zum Modell gesendet wird. Ich musste hinzufügen $formatters, die Daten aus dem Modell an das DOM sendet.

Nach den $ Parsern, habe ich die folgenden:

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

Dies bewirkt, dass die Validierung der Moment schießen das Modell geändert wird. Es ist hier mehr diskutiert: http://docs.angularjs.org/guide/forms, und hier http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController#$formatters

+0

funktioniert das? es löst die Validierung für mich nicht aus. – ovi

+0

es funktioniert! @ovi, das Formularfeld wird mit der CSS-Klasse "ng-invalid" angehängt, aber nicht "ng-dirty", suchen Sie danach. –