2017-07-05 4 views
0

Ich habe die folgende Direktive, die ich für die Validierung auf einem Mehrfachauswahl verwenden, um (dynamische) Länge Überprüfung der Anzahl der ausgewählten Elemente zu ermöglichen.

(function() { 
    'use strict'; 

    angular 
     .module('myModule') 
     .directive('listLength', listLength); 

    listLength.$inject = ['$parse']; 

    function listLength($parse) { 
     var directive = { 
      require: 'ngModel', 
      restrict: 'A', 
      link: link 
     }; 

     function link(scope, elem, attr, ngModel) { 
      var length = 0; 
      var exp = $parse(attr.listLength); 
      if (exp.constant) { 
       // Single value, no need to watch 
       length = exp(scope); 
      } else { 
       // We have an expression, need to watch for changes 
       scope.$watch(attr.listLength, function(newVal, oldVal) { 
        length = newVal; 
       }); 
      } 

      //For DOM -> model validation 
      ngModel.$parsers.unshift(function(value) { 
       if (!angular.isUndefined(value) && value !== "") { 
        var valid = value.length === length; 
        ngModel.$setValidity('listLength', valid); 
        return valid ? value : undefined; 
       } 
       return value; 
      }); 

      //For model -> DOM validation 
      ngModel.$formatters.unshift(function(value) { 
       if (!angular.isUndefined(value) && value !== "") { 
        var valid = value.length === length; 
        ngModel.$setValidity('listLength', valid); 
       } 
       return value; 
      }); 
     } 

     return directive; 
    } 
})(); 

Um es richtig zu aktualisieren zu haben, muss ich die Validierung auszulösen, wenn der Ausdruck (attr.listLength) Updates ausgeführt werden, aber es ist nicht mir klar, wie dies zu erreichen. Ich habe versucht, ngModel.$dirty auf True zu setzen, aber es wird immer noch nicht aktualisiert.

Antwort

0

Sieht aus wie der einzige Weg, dies in Angular 1.2 zu tun ist, ngModel.$setViewValue zu verwenden, die alle Validierungsfunktionen auslöst. Also wenn ich das tue

scope.$watch(attr.listLength, function(newVal, oldVal) { 
    length = newVal; 
    ngModel.$setViewValue(ngModel.$viewValue); // Set view value to itself... 
}); 

Es löst dann die Validierungsfunktionen aus. In angularjs 1.3+ kann dies mit ngModel gemacht werden. $ Validate()

0

Versuchen Sie, die Uhr Parameter wie das ändern:

scope.$watch("listLength", function(newVal, oldVal) { 
     length = newVal; 
}); 
+0

Dies stoppt es funktioniert völlig :) Die $ watch-Funktion selbst funktionierte gut, aber wenn Länge aktualisiert wird, muss ich die $ parsers.unshift erneut validiert Wert gegen die neue Länge – ptr

+0

Ich glaube, dass Validierung im Watch Callback aufgerufen werden sollte. Beim Watch Callback ist der einzige Code, der ausgeführt wird, der gesetzte Wert für das Attribut. –

Verwandte Themen