Sauter des formulaires imbriqués de validation avec AngularJS
Comment puis-je me passer de la validation des imbrications avec AngularJS? Je dois faire une forme extérieure valide même lorsque son enfant formulaire n'est pas valide.
Dans l'exemple ci-dessous forme extérieure doit être valide (fOuter.$valid
doit être vrai). Par défaut, il n'est pas. Est-il une option?
Code (jsFiddle):
<div ng-app ng-controller="Ctrl">
<ng-form name="fOuter">
<h3>Outer form (valid={{fOuter.$valid}})</h3>
<input type="text" name="txtOuter" ng-model="outer" placeholder="(required)" required />
<ng-form name="fInner">
<h3>Inner form (valid={{fInner.$valid}})</h3>
<input type="text" name="txtInner" ng-model="inner" placeholder="(required)" required />
</ng-form>
</ng-form>
</div>
- donc Externe non valide seulement si les deux ampoules ne sont pas valides, non?
- Je veux faire de la forme extérieure valide si son propre champ de texte est valide (et ne pas prêter attention à des champs non valides dans l'intérieur de la forme).
- Eu le même problème et résolu avec ce violon
Vous devez vous connecter pour publier un commentaire.
Donc il n'y a aucun moyen de faire forme extérieure pour être valide automatiquement (par
$valid
clé) lorsque l'un d'intérieure non valide.Essayez d'utiliser
error.required
Démo Violon
Angulaires ngForm docs:
L'autre sens devrait être d'utiliser le contrôleur, comme:
contrôleur
true
true
sur n'importe quel texte,false
sur vide$valid=true
, non pas que tous les champs sont valides).Voici ma solution inspirée par mbernath, qui isole complètement la forme elle-même de son père.
Cette solution de prendre soin de l':
Le voir en action dans cette JSFiddle.
Pour l'utiliser, il suffit d'appeler la directive "isoler-forme" :
angular.copy
produira une erreur (docs.angularjs.org/error/ng/cpws)J'ai connu le même problème. À l'intérieur d'un format plus grand que je devais avoir un sous-formulaire avec plusieurs champs à ne pas toucher à l'état du formulaire parent.
Voici ma solution: j'ai écrit une directive "null-forme" qui supprime le sous-formulaire dans le formulaire parent et qui n'envoie pas de modifications de l'état de son parent.
Vous pouvez alors l'utiliser comme ceci:
Tout changement ou négatif de la validation de "l'intérieur" ne prendra pas un effet de "parent".
Il y a un inconvénient, cependant, en raison de cette solution: sous-formulaire n'auront pas d'état ni ses classes CSS comme ng-invalide etc. travail. Pour ce faire, vous auriez besoin de ré-implémenter cette fonctionnalité dans la forme originale-contrôleur.
Au moins Angulaire de 1,5 il semble être suffisant pour supprimer le sous-formulaire à partir du parent à l'aide de
$removeControl
:Et voila, vierges et la validité des états de la société mère ne sont plus affectés par la imbriqué.
J'ai trouvé la solution qui fonctionne le mieux était d'Anton.
Réglage de la nullFormCtrl suggéré par mbernath désactive la validation du formulaire enfant (thxs pour le pavage du chemin, bien que...).
La seule modification que j'ai faite a été de la manière la parentForm est accessible. angulaire fournit une méthode pour cela.
JS:
Je suis un newbie Angulaire cependant, veuillez vérifier que le dessous de l'approche aide.
<div ng-app ng-controller="Ctrl">
<ng-form name="fOuter">
<h3>Outer form (valid={{fOuter.$valid}})</h3>
<ng-form name="fInner1">
<h3>Inner form 1 (valid={{fInner1.$valid}})</h3>
<input type="text" name="txtInner1" ng-model="outer" placeholder="(required)" required />
</ng-form>
<ng-form name="fInner2">
<h3>Inner form 2 (valid={{fInner2.$valid}})</h3>
<input type="text" name="txtInner2" ng-model="inner" placeholder="(required)" required />
</ng-form>
</ng-form>
</div>
J'ai eu le même problème et le résoudre avec peu de changement dans la copie locale de angular.js fichier lui-même.
En gros, j'ai ajouté une fonction nouvelle à l'FormController comme ci-dessous:
et de personnaliser la directive:
Également inspiré par mbernath, j'ai trouvé une solution plus simple. Il consiste à créer une forme mannequin-comme directive que pour l'isolation. La directive s'arrête la propagation à partir d'éléments imbriqués à la forme extérieure, mais il n'a pas de fonctionnalité de formulaire. Vous pouvez imbriquer des ngForms à l'intérieur et ont pleinement fonctionnelle.
La façon consiste à spécifier le nom de contrôleur de gestion dans la directive définition (
name: 'form'
). Cette propriété n'est pas documenté, mais il est utilisé pour la création de ngForm directive angulaire de la source.je voudrais suggérer mbernath la version sans inconvénient
À partir de votre contrôleur :
FormController est un Objet qui vous donne des informations sur votre état.
Ajout d'un formulaire à un formulaire, avec
ng-form
est l'ajout d'unFormController
de propriété de l'original de votreFormController
Objet.Cela a l'avantage de ne pas ajouter une directive html à l'ensemble de vos éléments d'entrée.
Fondamentalement, l'objectif est de séparer la connexion entre les imbrications et effectuer votre propre validation /accéder à la
$error
objets des formulaires de façon indépendante. Cela peut être fait par l'introduction d'un modelController entre deux des formulaires imbriqués et en permettant à cette modelController pour déterminer si le parent formulaire de contrôleur et de l'enfant forme contrôleur doit être valide /invalide. Ceci peut être réalisé en augmentant le$setValidity()
, qui détermine le moment où le formulaire doit aller valide /invalide.Veuillez trouver mon code dans le plunker lien ci-dessous. J'ai introduit un modèle de contrôleur entre le parent et l'enfant forme. Ici, j'ai résumé les
$error
objet de formulaire enfant dans le formulaire parent. Sens, le formulaire parent ne sera pas en mesure de voir quel est le problème avec le formulaire d'enfant, mais il sera annulé quand certaines champ de passe non valide dans le formulaire enfant. Seuls les intermédiaires modelController sait ce que les champs ont des questions dans le formulaire enfant. Cette logique peut être modifié ou
prolongée en fonction de nos besoins. S'il vous plaît laissez-moi savoir si quelqu'un a besoin de plus de précisions en termes de code.