Écouter pour soumettre le formulaire d'événement dans la directive
Je veux écouter du formulaire de soumission dans une directive. Dire que j'ai une directive comme ceci:
app.directive('myDirective', function () {
return {
restrict: 'A',
require: '^form',
scope: {
smth: '='
},
link: function (scope, el, attrs, formCtrl) {
scope.$watch(function(){
return formCtrl.$submitted;
},function(currentValue){
console.log('submitted');
});
}
}
});
Avec la méthode ci-dessus, je peux regarder pour la première soumettre, mais pas le reste. J'ai essayé de faire quelque chose comme ceci:
scope.$watch(function () {
return formCtrl.$submitted;
}, function (currentValue) {
if (currentValue) {
console.log('submitted');
formCtrl.$setPristine(); //Watch this line!
}
});
Mais alors le problème c'est que si j'utilise la directive dans une forme plus d'une fois, il ne fonctionne que pour la première utilisation.
Ce que je veux savoir c'est si il y a quelque chose comme formCtrl.onsubmit(...)
ou de toute solution de contournement pour obtenir la même fonctionnalité. Merci d'avance pour toute aide...
OriginalL'auteur s.alem | 2014-10-15
Vous devez vous connecter pour publier un commentaire.
Au lieu de regarder la
$submitted
de la propriété, vous pouvez créer une directive qui a le même nom que leform
directive, qui est attaché avec un gestionnaire d'événements pour soumettre le formulaire qui diffuse angulaire de l'événement que vous pouvez écouter dans votremyDirective
directive. Vous n'avez pas à vous soucier de substitution de l'angulaire de la mise en œuvre de laform
directive, il va tout simplement ajouter votre comportement ne pas écraser le construit-dans la mise en œuvre.DÉMO
Remarque: Vous pouvez également choisir de ne pas ajouter de la fonctionnalité à la
form
directive et, au lieu de choisir un autre nom de la directive, assurez-vous de bien attacher le nom de la directive en tant qu'attribut dans la balise form pour déclencher l'événement.Javascript
Mise à jour
À la lumière de la question dans le commentaire ci-dessous:
Il y a plusieurs façons de le faire:
.data()
méthode dans votremyForm
directive lors de la phase de compilation, et accéder à la fonction de lien dans votremyDirective
à l'aide de la.inheritedData()
méthode si les données attribuées dans leform
l'existence de la directive.Noter que j'ai passé le
form
contrôleur à l'intérieur de la diffusion dans lemyForm
directive. Cela garantit que vous recevez le formulaire parent contrôleur qui est de laform
élément. Il y a certains cas où vous utiliseriez lemyDirective
imbriquée à l'intérieur d'un formulaire viang-form
, donc au lieu de mettreform.$setPristine()
à laform
élément du formulaire de commande, vous seriez réglage de langForm
forme contrôleur.DÉMO
myForm
directive qui stocke forme des gestionnaires d'événements pour être itéré lorsqu'un formulaire événement est déclenché. Au lieu d'utiliser le$broadcast
angulaire de l'événement qui est en fait plus lentement que la mise en œuvre ci-dessous parce qu'il traverse chaque champ d'application de laform
élément jusqu'à la dernière portée de la chaîne. LemyForm
contrôleur ci-dessous crée son propre mécanisme pour stocker les gestionnaires d'événements. Tel que mis en œuvre dans le #1, à l'aide de la.data()
-inheritedData()
est lente lorsque lemyDirective
est enfoui au plus profond et imbriquée à partir d'un grand nombre d'éléments, puisqu'il traverse laDOM
vers le haut jusqu'à ce qu'il trouve spécifiquesdata
. À l'aide de la mise en œuvre ci-dessous, vous pouvez vérifier si le?^myForm
contrôleur existe dans le parent, l'avis de la?
il représente une condition facultative. En outre, la définition de l'étendue de vrai dans lemyForm
directive permet à la directive réutilisables, par exemple, plusieursmyForm
directives à l'intérieur d'une page.DÉMO
Vous voulez vérifier si le
myForm
directive, existe en tant que parent directive dans votremyDirective
directive?Oui, mais il n'a pas à être un parent direct. Je veux dire qu'il pourrait être comme ceci: le formulaire(formulaire)>div>div>entrée(avec myDirective) ou autre chose...
Vérifier ma mise à jour
OriginalL'auteur ryeballar
Vous pouvez utiliser
ng-submit
avec une diffusion ou quelque chose de similaire, mais peut-être d'abord donner$setUntouched()
un essai, ou peut-être définir manuellement$submitted
retour àfalse
après vous avez terminé avec la présentation actuelle.OriginalL'auteur Mosho
https://docs.angularjs.org/api/ng/directive/ngSubmit est probablement ce que vous cherchez.
Dans ce cas, vous pourriez essayer ce Mosho dit, et de mettre ng-soumettre dans ton <form> balise, puis la diffusion d'un événement à l'enfant $champ d'application (la "directive")
OriginalL'auteur mr-wildcard
Ce post est probablement mort, mais de construire sur le dessus, j'ai trouvé la forme de la directive n'a pas été de radiodiffusion pour les autres directives correctement alors je l'ai inclus tout dans une directive.
Ici est une des fonctions simples qui génère une alerte sur le formulaire.$erreur si le formulaire n'est pas valide:-
OriginalL'auteur Julien Bongars