154 votes

Puis-je accéder à un formulaire dans le contrôleur?

Je suis actuellement en train d'utiliser ce qui suit.

$scope.$$childHead.customerForm[firstName], afin que :

Mais cela ne fonctionne que dans Chrome. Maintenant j'ai essayé ce qui suit :

$scope.editCustomerForm[firstName], afin que :

Ce qui ne fonctionne pas. Notez que mon formulaire est à l'intérieur d'un onglet Foundation. Comment puis-je accéder à firstName ?

MODIFICATION : Il semble que le form ne soit pas ajouté au scope lorsqu'il est à l'intérieur d'un onglet Foundation.

Quelqu'un a-t-il une solution pour cela ?

213voto

slopapa Points 239

La raison pour laquelle vous ne pouvez pas accéder à l'entrée est que l'onglet Foundation (ou ng-repeat?) crée une portée isolée. Une façon de résoudre ce problème est d'utiliser la syntaxe controller as :

    ...inputs
    Salissant ? {{ctrl.myForm.$dirty}}

    Enregistrer

Ensuite, vous pouvez accéder au FormController dans votre code comme suit :

function MyController () {
    var vm = this;
    vm.saveChanges = saveChanges;

    function saveChanges() {

       if(vm.myForm.$valid) { 
            // Enregistrer dans la base de données ou autre.
            vm.myForm.$setPristine();
       }
}

94voto

ondrs Points 1095

Vous pouvez attacher le formulaire à un objet qui est défini dans un contrôleur parent. Ensuite, vous pouvez accéder à votre formulaire même depuis une portée enfant.

Contrôleur parent

$scope.forms = {};

Un modèle dans une portée enfant

Le problème est que le formulaire n'a pas besoin d'être défini au moment où le code dans le contrôleur est exécuté. Vous devez donc faire quelque chose comme ceci

$scope.$watch('forms.form1', function(form) {
  if(form) {
    // votre code...
  }
});

91voto

Anthony Shull Points 1085

Si vous souhaitez transmettre le formulaire au contrôleur à des fins de validation, vous pouvez simplement le passer en tant qu'argument à la méthode traitant la soumission. Utilisez le nom du formulaire, donc pour la question initiale, cela ressemblerait à ceci :

Enregistrer

85voto

Atul Chaudhary Points 95

Un peu tard pour une réponse mais je suis venu avec l'option suivante. Cela fonctionne pour moi mais je ne suis pas sûr que ce soit la bonne façon ou non.

À mon avis, je fais ceci:

Et dans le contrôleur:

$scope.setForm = function (form) {
    $scope.myForm = form;
}

Maintenant, après avoir fait ceci, j'ai mon formulaire dans ma variable de contrôleur qui est $scope.myForm

24voto

Carsten Points 2274

Pour pouvoir accéder au formulaire dans votre contrôleur, vous devez l'ajouter à un objet de portée fictif.

Quelque chose comme $scope.dummy = {}

Pour votre situation, cela signifierait quelque chose comme :

Dans votre contrôleur, vous pourrez accéder au formulaire par :

$scope.dummy.customerForm

et vous pourrez faire des choses comme

$scope.dummy.customerForm.$setPristine()

LIEN WIKI

Avoir un '.' dans vos modèles garantira que l'héritage prototypal est en jeu. Ainsi, utilisez plutôt que

Si vous voulez/vraiment devez utiliser un type primitif, il existe deux solutions de contournement :

1.Utilisez $parent.parentScopeProperty dans la portée enfant. Cela empêchera la portée enfant de créer sa propre propriété. 2.Définissez une fonction sur la portée parent et appelez-la depuis l'enfant, en transmettant la valeur primitive à la portée parente (pas toujours possible)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X