isvalid - form scope angularjs



Posso acessar um formulário no controlador? (7)

Atualmente estou usando o seguinte.

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

<form name="customerForm">
  <input type="text" name="firstName" 
         ng-model="data.customer.firstName" 
         tabindex="1"  
         ng-disabled="!data.editable" 
         validationcustomer />
</form>

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

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

<form name="customerForm" ng-model="editCustomerForm">
  <input type="text" name="firstName" 
         ng-model="data.customer.firstName" tabindex="1"  
         ng-disabled="!data.editable" 
         validationcustomer />
</form>

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?

https://ffff65535.com


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
});

Embora aludido em outros comentários, eu pensei em soletrar um pouco para aqueles que usam a sintaxe "Controller As":

<div ng-controller="MyController as ctrl">

<form name="ctrl.myForm">
    ...inputs
    Dirty? {{ctrl.myForm.$dirty}}

    <button ng-click="ctrl.saveChanges()">Save</button>
</form>

</div>

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();
       }
}

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

Algo como $scope.dummy = {}

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

<form name="dummy.customerForm">

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 irá garantir que a herança prototypal está em jogo. Então, use <input type="text" ng-model="someObj.prop1"> ao invés de <input type="text" ng-model="prop1">

Se você realmente quer / precisa 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 função no escopo pai e chame-a do filho, passando o valor primitivo para o pai (nem sempre possível)


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:

<form name="formName">
    <div ng-init="setForm(formName);"></div>
</form>

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


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


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

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, qualquer diretiva personalizada 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 <form> .

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 objeto dentro de seu controlador por this.formName





angularjs-forms