Posso acessar um formulário no controlador?

Atualmente estou usando o seguinte.

$scope.$$childHead.customerForm[firstName] , de modo que:

    

Mas isso só funciona no Chrome. Agora eu tentei o seguinte:

$scope.editCustomerForm[firstName] , de modo que:

    

Que não funciona. Observe que meu formulário está dentro de uma guia Foundation. Como posso acessar o firstName ?

EDIT : Parece que o form não é adicionado ao scope quando está dentro de uma guia Foundation.

Alguém tem uma solução para isso?

Embora aludido em outros comentários, pensei em soletrá-lo um pouco para aqueles que usam a syntax “Controller As”:

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

Então você pode acessar o FormController no seu código como:

 function MyController () { var vm = this; vm.saveChanges = saveChanges; function saveChanges() { if(vm.myForm.$valid) { // Save to db or whatever. vm.myForm.$setPristine(); } } 

Você pode append o formulário a algum object que é definido em um controlador pai. Então você pode acessar seu formulário mesmo de um escopo filho.

Controlador pai

 $scope.forms = {}; 

Algum modelo em um escopo filho

 

O problema é que o formulário não precisa ser definido no momento em que o código no controlador é executado. Então você tem que fazer algo parecido com isto

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

Se você quiser passar o formulário para o controlador para fins de validação, pode simplesmente passá-lo como um argumento para o método que manipula o envio. Use o nome do formulário, então, para a pergunta original, seria algo como:

  

Pouco tarde para uma resposta, mas veio com a seguinte opção. Está funcionando para mim, mas não tenho certeza se é a maneira correta ou não.

Na minha opinião, estou fazendo isso:

 

E no controlador:

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

Agora, depois de fazer isso eu tenho meu formulário na minha variável de controlador que é $scope.myForm

Para poder acessar o formulário no seu controlador, você deve adicioná-lo a um object de escopo fictício.

Algo como $scope.dummy = {}

Para sua situação, isso significaria algo como:

 

No seu controlador, você poderá acessar o formulário por:

 $scope.dummy.customerForm 

e você será capaz de fazer coisas como

 $scope.dummy.customerForm.$setPristine() 

WIKI LINK

Tendo uma ‘.’ em seus modelos, garantirá que a inheritance prototípica esteja em jogo. Então, use ao invés de

Se você realmente quiser / precisar usar um primitivo, há duas soluções alternativas:

1.Use $ parent.parentScopeProperty no escopo filho. Isso impedirá que o escopo filho crie sua própria propriedade. 2.Defina uma function no escopo pai e chame-a do filho, passando o valor primitivo para o pai (nem sempre possível)

Esta resposta está um pouco atrasada, mas me deparei com uma solução que torna tudo muito mais fácil.

Você pode realmente atribuir o nome do formulário diretamente ao seu controlador, se você estiver usando a syntax controllerAs e, em seguida, referenciá-lo de sua variável “this”. Veja como eu fiz isso no meu código:

Eu configurei o controlador via ui-router (mas você pode fazê-lo como quiser, mesmo no HTML diretamente com algo como

) Isto é o que pode parecer em um ui-roteador configuração do roteador:

 views: { "": { templateUrl: "someTemplate.html", controller: "someController", controllerAs: "myCtrl" } } 

e, em seguida, no HTML, basta definir o nome do formulário como “controllerAs”. “name” da seguinte forma:

     

Agora dentro do seu controlador você pode simplesmente fazer isso:

 angular .module("something") .controller("someController", [ "$scope", function ($scope) { var vm = this; if(vm.someForm.$valid){ // do something } }]); 

Sim, você pode acessar um formulário no controlador (como indicado nos documentos ).

Exceto quando seu formulário não está definido no escopo do controlador e é definido em um escopo filho.

Basicamente, algumas diretivas angulares, como ng-if , ng-repeat ou ng-include , criarão um escopo filho isolado. Assim, todas as diretivas personalizadas com um scope: {} propriedade definida. Provavelmente, os componentes da sua fundação também estão no seu caminho.

Eu tive o mesmo problema ao introduzir um simples ng-if torno da tag

.

Veja estes para mais informações:

Nota: sugiro que você reescreva sua pergunta. A resposta para sua pergunta é sim, mas seu problema é um pouco diferente:

Posso acessar um formulário em um escopo filho do controlador?

Para o qual a resposta seria simplesmente: não .

adicione o atributo ng-model="$ctrl.formName" ao seu formulário e, em seguida, no controlador, você pode acessar o formulário como um object dentro de seu controlador por this.formName

Definitivamente você não pode acessar o formulário no escopo bec. não é criado. O DOM do template html é carregado pouco a pouco como o construtor do controller. a solução é assistir até DOM carregado e todo o escopo definido!

no controlador:

 $timeout(function(){ console.log('customerForm:', $scope.customerForm); // everything else what you need }); 

Sim, você pode acessar o seu a partir do controlador usando this.formname.

Intereting Posts