2015-03-19 1 views
5

J'ai un scénario de validation angulaire où un champ doit être valide que si elle est désactivée, auquel cas il doit être ignoré.validation de forme angulaire avec champ désactivé

(J'utilise ng-messages à des fins de démonstration, cela n'affecte pas l'état $errors du formulaire/champ).

Comment pouvons-nous dégageons max et required erreurs lorsque le champ est désactivé? .

<form name="myForm"> 
    <label><input type="checkbox" ng-model="disable"> disable field</label><br> 

    <input name="width" type="number" ng-disabled="disable" ng-disabled="disable" ng-model="someValue" max="100" required> 

    <div class="errors" ng-messages="myForm.width.$error"> 
    <div ng-message="required">Please enter a width</div> 
    <div ng-message="max">Width is over the max permitted</div> 
    </div> 
</form> 

myForm $ valide = {{myForm valide $}.}

Voici un exemple de travail sur JS Bin: http://jsbin.com/supapotoci/1/edit?html,output

Répondre

3

Voici votre élément d'entrée serait comme ci-dessous à l'aide ng-max & ng-required

Markup

<input name="width" type="number" ng-disabled="disable" ng-disabled="disable" 
ng-model="someValue" ng-max="disable ? false: 100" ng-required="!disable"> 

JSBIN

+1

Excellent, merci. Je n'avais pas réalisé que 'ng-max' accepterait une valeur booléenne comme ça. – Ade

+0

@Ade Merci :) en fait, il pourrait être autre que le nombre..like '' ''/'true' fonctionne aussi .. Je ne savais pas: p –

+2

@downvoter pourrais-je savoir raison derrière downvote? il serait bon de savoir où je me trompe pour m'improviser –

2

ng-requis n'a pas fonctionné pour moi avec variables principalement parce que lorsque vous utilisez

ng-required="{{test}}" le {{test}} est renvoyé sous forme de chaîne lorsque ngRequired attend booléen, heureusement vous pouvez l'utiliser de la même manière ngClass œuvres, si vous remplacez votre entrée avec le code suivant cela fonctionnera

<input name="width" type="number" 
    ng-disabled="disable" 
    ng-model="someValue" 
    ng-max="{false: false, true: 100}[!disable]" 
    ng-required="{true : true, false : false}[!disable]" /> 
9

Solu La contribution de @pankajparkar est très bonne.

Dans le cas si vous ne voulez pas de changements dans votre balisage, vous pouvez essayer.

directive('ngDisabled', function() { 
    return { 
     link: function (scope, element, attrs) { 
      var ngModelController = element.controller('ngModel'); 
      if (!ngModelController) { 
       return; 
      } 
      scope.$watch(attrs.ngDisabled, function (nv, ov) { 
       if (nv) { //disabled 
        //reset 
        Object.keys(ngModelController.$validators) 
         .forEach(function (type) { 
          ngModelController.$setValidity(type, true); 
         }) 
       } else { 
        ngModelController.$validate(); 
       } 
      }) 
     } 
    } 
}); 
+0

Belle approche utilisant la directive. +1, pourriez-vous s'il vous plaît expliquer ce que 'Object' est dans votre réponse. :) –

+1

@pankajparkar merci pour l'upvote. 'Object' est le' Object' global fourni par le navigateur. En utilisant la méthode 'keys' définie dessus, nous pourrons récupérer les clés définies sur un objet javascript. 'ngModelController. $ validators' contiendra une carte de type de validation et la fonction à exécuter. –

+0

est-ce que ce serait le même 'Object' sur cross browser? Serait-il présent sur le navigateur comme IE9 & IE 10? –