2016-04-19 13 views
2

Gibt es eine Möglichkeit, eine Eingabegültigkeit innerhalb einer Direktive festzulegen? Die Eingabe, die in der Vorlage der Richtlinie vorhanden ist.So legen Sie die Gültigkeit in der Direktive fest (angularjs)

Lets sagen, ich habe Vorlage:

<input type="text" ng-model="someObj.val" ng-change="check()"> 

Und meine Direktive ist wie:

.directive('myDir', function() { 
     return { 
     restrict: 'E', 
     templateUrl: 'trmplate.html', 
     link: function (scope) { 

      someObj = {val: '123'}; 

      scope.check = function() { 
      var result = false; 
      myInput.$setValidity(result); //this is didn't work, $setValidity not a function 
      }; 

     } 
     } 
    }) 

ich bin, kann es nicht mit Form wickeln, denn die Idee dahinter ist, Benutzer zu ermöglichen, umfasst Diese Eingabe in das Formular des Benutzers.

+1

Was ist 'myInput'? – dfsq

+0

@dfsq Um ehrlich zu sein, ich wusste einfach nicht, welches Objekt die $ setValidity-Methode haben sollte. Irgendwo habe ich 'ngModel gefunden. $ SetValidity()', irgendwo war es 'ctrl. $ SetValidity()' –

+0

Wenn Sie ngModel benötigen und wichtig ist, sollten Sie diesem Eingabeelement einen Namen geben, dann können Sie auf $ zugreifen und setzen Gültigkeit dieses Elements mit Controller (vierter Parameter der Link-Funktion). oder sehe meine Frage http://stackoverflow.com/questions/30156602/angularjs-set-validity-in-directive-link-function – 9me

Antwort

2

Sie müssen NgModelController Instanz abzurufen mit dem Eingang verbunden. Dann rufen Sie $setValidity für dieses Objekt auf und geben den Validierungsschlüssel an (erforderlich, minlength, customkey, etc.). Es wird wie folgt aussehen:

.directive('myDir', function() { 
    return { 
    restrict: 'E', 
    template: '<input type="text" ng-model="someObj.val" ng-change="check()">', 
    link: function(scope, element) { 

     var modelController = element.find('input').controller('ngModel'); 

     someObj = { 
     val: '123' 
     }; 

     scope.check = function() { 
     var result = false; 
     modelController.$setValidity('myrequired', result); 
     }; 

    } 
    } 
}) 

Der wichtigste Teil ist hier, wie NgModelController zu bekommen. Im Folgenden Codezeile kümmert es:

var modelController = element.find('input').controller('ngModel'); 
1

Ich sehe nicht myInput zu nichts zugewiesen, deshalb ist $ setValidity keine Funktion. Außerdem befindet sich SomeObj nicht auf dem Bereich, und ich vermute, Sie falsch geschrieben "Vorlage". Ich würde so etwas wie dies empfehlen:

.directive('myDir',() => { 
    return { 
    restrict: 'E', 
    templateUrl: 'template.html', 
    link: (scope, element) => { 

     scope.someObj = {val: 123}; 

     scope.check =() => { 
     let result = false; 
     element.find('input').val().$setValidity(result); //this is didn't work, $setValidity not a function 
     }; 

    } 
    } 
}) 
+1

Dies wird eine Ausnahme auslösen, weil String nicht $ SetValidity-Methode hat. – dfsq

+0

Guter Punkt. Aktualisiert, um nur Zahlen zu verwenden. Ich habe $ setValidity schon lange nicht mehr benutzt. –

+0

Ich glaube, du verstehst falsch: '$ setValidity' ist die Methode von' NgModelController'. In Ihrem Fall wird nur TypeError geworfen, weil String oder Nummer natürlich diese Methode nicht hat. – dfsq

2

Sie brauchen nicht Elem zu verwenden, um die Steuerung zu erhalten, fügen Sie ihn einfach als param auf die Link-Funktion und Satz erfordern [ 'ngModel '], um das Modell ctrl zu bekommen.

require: ['ngModel'], 
link: function (scope, elem, attrs, ctrl) { 

     someObj = {val: '123'}; 

     scope.check = function() { 
     var result = false; 
     ctrl.$setValidity(result); 
     }; 

    } 
+1

Zuallererst ist 'element.controller()' nicht jQuery. Aber vor allem wird Ihre Antwort so etwas wie 'TypeError werfen: Kann die Eigenschaft '$ setValidity' von 'undefined' nicht lesen, weil Controller, der als 4. Parameter verfügbar ist, nichts mit ngModelController zu tun hat, das OP abzurufen hat. – dfsq

+0

Sie haben Recht, es ist nicht jQuery, mein Schlechter. Und ich vergaß zu sagen, dass er hinzufügen muss: ['ngModel'], damit der ctrl param richtig funktioniert, werde meine Antwort bearbeiten. –

+0

Ich dachte, dass Sie vergessen haben, 'require: ['ngModel']' hinzuzufügen, aber dies ändert nichts an der Tatsache, dass es immer noch TypeError sein wird. Es wird nur funktionieren, wenn es 'ng-model' in der Direktive' myDir' gibt. Auch hier ist es nicht mit dem NgModelController der 'Eingabe' in der Vorlage verbunden. – dfsq

Verwandte Themen