2013-10-16 22 views
21

Ich hoffe, das ist kein Duplikat - viele ähnliche Fragen über, aber ich kann keine Antwort finden, die funktioniert.Angularjs erhalten Formular Feldgültigkeit innerhalb der Direktive

Ich habe eine Angular-Richtlinie, also:

app.directive('emailInput', function(){ 
    return { 
     restrict: 'E', 
     templateUrl: 'template.html', 
     link: function(scope, elem, attrs, ctrl){ 
      elem.bind('keyup', function(){ 
       // TODO - what? 
      }) 
     } 
    } 
} 

und in der Vorlage html:

<input type="email" required ng-model="emailAddress" /> 

Ohne den Namen des Formulars zu kennen, in der link Funktion, ich möchte das wissen Wert der emailAddress.$valid Eigenschaft - wie kann ich das bekommen?

+0

Siehe auch [hier] (http://stackoverflow.com/a/41072188/1021943) für eine neuere (und wohl sauberere) Lösung mit AngularJS> = 1.5.0. –

Antwort

32

Sie können die formController benötigen, die Sie alle Eingaben in das Formular

app.directive('emailInput', function(){ 
    return { 
     require: '^form', // We look for it on a parent, since it will be defined somewhere higher on the DOM. 
     restrict: 'E', 
     templateUrl: 'template.html', 
     link: function(scope, elem, attrs, ctrl){ 
      elem.bind('keyup', function(){ 
       ctrl.emailAddress.$valid //check validity 
      }) 
     } 
    } 
} 

registriert Zugang geben würde Denken Sie daran, dass Angular Spur von Eingabeelementen nach Namen hält. So haben Sie Ihre Eingabe einen Namen geben Attribut

<input type="email" required ng-model="emailAddress" name="emailAddress" /> 

ich auch vielleicht würde empfehlen, nur all dies durch eine Richtlinie Attribut übergeben. Wahrscheinlich möchten Sie die Feldnamen nicht hart codieren. So konnte man nur ein Attribut, das die Gültigkeit

inputIsValid='formName.emailAddress.$valid' 

und bewerten (oder $ jetzt sehen) in der Richtlinie nimmt.

+0

Perfekt, vielen Dank. –

+0

Können wir Zugriff auf das Feld mit dem folgenden Namen erhalten: name = 'some.thing'? – Rroman

+0

Ich habe es nicht selbst versucht, aber js lässt Sie eine beliebige Zeichenfolge als Schlüssel für ein Objekt verwenden. Der einzige Unterschied besteht darin, dass Sie eckige Klammeroperatoren verwenden müssen, um darauf zuzugreifen. ctrl ['some.thing']. $ Gültig – Adam

2

Wir können die Gültigkeit einfacher überprüfen, ohne den Namen der Eingabeelemente zu kennen.

app.directive('emailInput', function(){ 
    return { 
     require: '^form', // We look for it on a parent, since it will be defined somewhere higher on the DOM. 
     restrict: 'E', 
     templateUrl: 'template.html', 
     link: function(scope, elem, attrs, ctrl){ 
      elem.bind('keyup', function(){ 
       ctrl.$valid //check validity here 
      }) 
     } 
    } 
} 
1

Dies ist eine alte Post, aber für die Leute, die hier durch googeln, ist dies der sauberste Weg Gültigkeit einer Eingabe in Ihrer Richtlinie zu überprüfen, ohne seinen Namen zu wissen, so dass Sie Ihre Richtlinie über jede Eingabe verwenden können Element.

Sie müssen nur die ngModel Controller benötigen:

app.directive('emailInput', function(){ 
    return { 
    require: 'ngModel' 
    restrict: 'E', 
    templateUrl: 'template.html', 
    link: function(scope, elem, attrs, ngModelCtrl){ 
     elem.bind('keyup', function(){ 
      ngModelCtrl.$valid //check validity 
     }) 
    } 
    } 
} 

Siehe AngularJS Dokument für ngModel.NgModelController, $valid unter dem Abschnitt Eigenschaften:

https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

+0

Ihre Antwort zeigt einen Code, der * fast * ein Kopieren/Einfügen von @preservant über Ihnen ist. Entweder erklären Sie, warum Ihr besser ist oder edit @ preservant's Antwort. Sie schreiben 'require: 'ngModel'' anstelle von' require:'^form''. Der Rest ist im Grunde gleich. –

+0

@OferZelig Der Unterschied ist mit 'require: '^ form'' es muss nach' form' auf den Eltern des Elements suchen, aber mit 'require:' ngModel'' sieht es nur auf dem Element selbst aus. Plus, 'ngModel' ist wirklich die Sache, die wir hier brauchen, nicht die' Form' – Masoud

+0

Ja also ich denke am besten ist es, die vorherige Antwort zu bearbeiten und eine kanonische zu haben, es ist weniger verwirrend für Leute. –

1

weiß, es ist ein alter Thread aber wenn jemand auf dieses Problem stößt, so habe ich es gelöst:

0

Hier ist eine Richtlinie, die auch schmutzig auf true gesetzt werden, wenn nichts eingegeben wurde.

standardmäßig $ schmutzig wird gesetzt, wenn etwas in typisiert ist und würde zeigen, nicht eine erforderliche Fehlermeldung, bis der Benutzer sendet . Mit diesem

function() { 
    return function (scope, element, attrs) { 
     $(element).blur(function() { 
      scope.$apply(function() { 
       var field = scope.$eval(attrs.makeDirty); 
       field.$dirty = true; 
      }); 
     }); 
    }; 

HTML:

<label class="fieldLabel" for="confirmEmail">Confirm Email*</label> 
<input type="text" id="confirmEmail" name="confirmEmail" ng-model="confirmEmail" ng-pattern="{{Ctrl.Model.Email.EmailAddress}}" required make-dirty="form.confirmEmail"> 
<span class="error" ng-show="form.confirmEmail.$error.pattern && form.confirmEmail.$dirty">Emails must match</span> 
<span class="error" ng-show="form.confirmEmail.$error.required && (form.$submitted || form.confirmEmail.$dirty)">Confirm your email</span> 

Das mir Feedback, wenn der Benutzer zu geben, ermöglicht wird Ausfüllen oder auf dem Formular Tabbing.

0

Lassen Sie mich Ihnen eine weitere Möglichkeit geben, es zu tun, ist es in einigen Fällen sinnvoll sein kann

link: function (scope, element, attrs, formCtrl) { 
    scope.fileSizeError=false; 
    scope.$watch(function() { 
       return formCtrl.fileP.$error.maxSize; 
      },function(newValue) { 
       scope.fileSizeError=newValue; 
      });   
} 

In meinem Fall habe ich in einer Richtlinie war das verwendet wird, um eine Datei zu laden, so brauchte ich den Zustand kennen der var $ error.maxSize in der Vorlage so habe ich auf diese Weise gemacht.

Verwandte Themen