Comment accéder à FormController dans le contrôleur ou la portée parent dans AngularJS
J'ai une page avec plusieurs formes et je veux seulement montrer un à un. Pour cela, j'ai séparé chaque forme à une section, et à l'aide de Bootstrap accordéon de plugin je ne permettre qu'une seule section ouverte à la fois.
Balisage ressemble à quelque chose comme ceci:
<a ng-click="open_section('section1')">Section 1</a>
<div collapse="section1">
<form name="section1Form">
</form>
</div>
<a ng-click="open_section('section2')">Section 2</a>
<div collapse="section2">
<form name="section2Form">
</form>
</div>
Tout fonctionne bien, je peux naviguer entre les formes etc.
Parce que je ne veux pas que l'utilisateur ouvre une section si celle qu'ils sont en cours de modification contient des erreurs de validation, j'ai essayé de vérifier dans le open_section
fonction si le formulaire qui lui est associé est valide ou non.
J'ai essayé, mais je ne pouvais pas. Je ne pouvais pas accéder à la FormController associés avec les formes dans le contrôleur est responsable de la page. Pour une raison quelconque, ils ne sont pas d'être publié sur le champ.
C'est ce que j'ai essayé:
$scope.section1Form
estundefined
- essayé avec
$scope.$watch('section1Form, function(){})
encore indéfini - essayé d'ajouter le nom de la forme en tant que second paramètre à
open_section
comme suit:open_section('section1', section1Form)
mais dans la fonction que le deuxième argument estundefined
.
Entre les <form></form>
les balises, j'ai accès à la FormController, mais en dehors d'elles, je n'en ai pas. Depuis l'événement est à venir à partir de l'extérieur de la <form>
(le cours de clôture, à l'ouverture de sections) je ne peux pas passer le FormController à mon contrôleur pour vérifier la validité de mes formulaires.
Est-il un moyen pour contourner ce problème, ou devrais-je refactoriser le code de ma page?
Je suis en utilisant Angulaire 1.1.5 btw.
En outre, vérifier avec le AngularJS Batarang plugin Chrome, je peux voir que les formes ont publié des enfants étendues à l'étendue actuelle.
MODIFIER: c'est la façon dont le champ d'application de la hiérarchie des regards pour cette application
- root
|
---current controller\'s scope
|
----scope that contains the forms
Est-ce parce que je suis en utilisant ng-include
? Il n'y a pas moyen d'accéder à ces formes dans un contrôleur, alors?
source d'informationauteur adamors
Vous devez vous connecter pour publier un commentaire.
De traiter avec des formes dynamiques, et donc la dynamique de localisation des associés FormController, j'ai utilisé une simple directive aider à localiser le champ qui contient le formulaire.
Solution:
Créer une directive $émettent de la portée associée w/forme:
Utiliser la directive dans le balisage:
Écouter pour le cas de diffusion par la directive dans votre contrôleur:
Il y a un moyen beaucoup plus simple pour communiquer dans le cadre de la hiérarchie en utilisant angulaire du processus de recherche d'objets dans son champ d'application de la hiérarchie.
Cela nous permet de fixer l'objet d'une moindre étendue dans une étendue supérieure à l'aide de la notation par points.
Dans ce cas, vous devez créer un "catcher" objet vide sur le dessus de la commande de niveau. Cette catcher objet peut ensuite être affectés à la forme des objets à partir de la plus faible étendues. Voici une débarquez pour la démo.
http://plnkr.co/edit/xwsu48bjM3LofAoaRDsN?p=preview
Il n'est pas parfaitement élégante, mais si vous pensez de cette "catcher" objet comme un écouteur d'événement, nous sommes toujours en suivant un modèle standard.
créer un vide de détecteur d'objet dans le contrôleur de l'endroit où vous souhaitez une référence à la imbriqué
Puis dans la balise elle-même chaque fois que le ng-forme de la directive est déclarée, le jeu catcher.nomformulaire = formName comme
Parce que nous sommes attribuées à la "catcher.", angulaire de la traversée de la portée de la hiérarchie et de trouver thd dans le mainController peu importe le nombre de contrôleurs entre les deux (en supposant qu'ils n'ont pas de détecteur d'objet, bien sûr)
Parce que j'ai été en utilisant des vues partielles avec
ng-view
les formes ont été enregistrés sur un enfant de mon contrôleur. Il semble que je ne peut pas accéder à l'enfant des étendues d'un parent, en raison de l'héritage par prototype.Cela dit, j'ai réussi à obtenir la forme instances du contrôleur dans mon contrôleur en les faisant passer par la fonction qui a été responsable de l'ouverture/la fermeture de l'accordéon.
La solution est quelque chose comme ceci:
Dans le angulaire de la documentation on peut lire:
Cependant, il ya certaines directives, comme ngIfque de créer un nouveau champ d'application:
Peut-être votre cas? Si oui, vous pouvez essayer de définir le nom du formulaire à quelque chose comme "des formes.section1Form", puis accédez-y par conséquent dans le champ d'application.
Pour accéder à la forme d'une directive, contrôleur, etc... vous pouvez utiliser ng-init:
Par exemple:
Vous le savez peut accéder aux données d'un formulaire, ou à passer à l'arrière avec une variable liée si c'est une directive.
Exemple de commande pour le modèle ci-dessus:
Ceci est similaire à Sinil D répondre grande réponse, qui est enregistre le formulaire sur le parent $portée, mais il n'utilise pas les événements. Il s'agit essentiellement de faire la même chose, mais en un peu moins de frais généraux.
Pour obtenir le réelle
FormController
responsable d'une certaine directive, il vous suffit derequire
laform
avec le chapeau de préfixe. Cela permet de stocker une référence dans vos directives fonction de lien:Votre contrôleur peut être hors de votre forme OU votre essayez d'obtenir votre formulaire avant le formulaire est renseigné dans le champ d'application.
J'ai créé un PlunkR et il fonctionne bien.
Concernant Sunil D., le roman de la solution pour fournir la forme du champ d'application de parent étendues (voir https://stackoverflow.com/a/22487840/1518575), vous pouvez réellement obtenir la forme du champ d'application de l'objet événement qui est envoyé dans un $émettre l'appel.
Depuis au moins Angulaire 1.0.3, l'objet de l'événement a un targetScope de la propriété, qui fait référence à la portée de l'événement était de $émettent-ed. (Voir http://docs.angularjs.org/api/ng/type/$rootScope.Champ#$pour plus d'informations sur les propriétés de l'objet d'événement.)
Avec cela à l'esprit, vous pouvez simplifier Sunil D. directive du code:
Le modèle ne change pas du tout:
Et par la suite vous pouvez modifier le code de gestion des événements:
Cette directive serait pertinente dans tous les scénarios où vous voudriez offrir une gamme pour l'un de ses ancêtres, et pas seulement dans le cas de ngForm. Dans mon code, j'ai renommé la présente directive au plus génériques "présent", puisqu'une façon de penser de l'objectif de la directive est qu'il annonce la présence d'un champ.
Je sais que cela va causer beaucoup de l'horreur.... mais j'ai été assez paresseux et utilisé le suivant (à qui j'ai envie de croire ne pas créer de surcharge massive en raison d'être ajouté comme une montre et d'exécution de chaque digest):
Puis-je utiliser le
controller.referenceToForm
dans mon contrôleur, etc.Similaire à Sunil D. solution, j'ai trouvé un similaire, mais implicitement réglage de la portée de la variable, la formController dans lequel la balise a été utilisé, comme je ne veux pas coder en dur le nom de la forme à deux reprises:
Et puis, la vue de quelque chose comme: