Atualmente, estou usando o seguinte.
$scope.$$childHead.customerForm[firstName]
, de modo a:
<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 a:
<form name="customerForm" ng-model="editCustomerForm">
<input type="text" name="firstName"
ng-model="data.customer.firstName" tabindex="1"
ng-disabled="!data.editable"
validationcustomer />
</form>
O que não funciona. Observe que meu formulário está dentro de uma guia Foundation. Como posso acessar firstName
?
EDIT : Parece que form
não é adicionado ao scope
quando está dentro de uma guia Foundation.
Alguém tem uma solução para isso?
Você pode anexar o formulário a algum objeto definido em um controlador pai. Em seguida, você pode acessar seu formulário mesmo no escopo filho.
Controlador pai
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 assim
fonte
var watcher = $scope.$watcher
e dentro da instrução if você chamaria watcher () para desvincular o relógio. Isto o torna um relógio 1 hora para que você não está observando cada digerir depois de ser definidaSe você deseja passar o formulário para o controlador para fins de validação, basta passá-lo como argumento ao método que manipula o envio. Use o nome do formulário, portanto, para a pergunta original, seria algo como:
fonte
<form name="myform"></form>
, ou mesmo<div ng-form name="myform"></div>
, então o seu clique evento seria o seguinte:ng-click="submit(myform)"
. Então você pode acessar o objeto de formulário Angular na sua função de clique, como:$scope.submit = function (form) { if (form.$valid) {
etc.Um pouco atrasado 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 o seguinte:
E no controlador:
Agora, depois de fazer isso, tenho meu formulário na minha variável de controlador, que é
$scope.myForm
fonte
name
atributo seja exatamente o que eu quero. O problema com as outras soluções de objeto fictício é que, se esse componente for usado em outro componente com um formato ng, esse outro formato usará esse nome literalmente. Portanto, ele terá um campo com um nome literal de string (NÃO propriedades aninhadas) de "dummy.myForm"; achei isso inaceitável.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:
No seu controlador, você poderá acessar o formulário:
e você poderá fazer coisas como
WIKI LINK
fonte
dummy.customerForm
será indefinido até que as condições deng-if
são cumpridos no caso do elemento de formulário tem umang-if
condicional em cima deleEsta resposta está um pouco atrasada, mas me deparei com uma solução que facilita muito as coisas.
Você pode realmente atribuir o nome do formulário diretamente ao seu controlador se estiver usando a sintaxe controllerAs e, em seguida, referenciá-lo da sua variável "this". Aqui está como eu fiz isso no meu código:
Eu configurei o controlador via ui-router (mas você pode fazê-lo da maneira que quiser, mesmo no HTML diretamente com algo assim
<div ng-controller="someController as myCtrl">
) É assim que pode parecer em uma configuração de ui-router: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:
fonte
Sim, você pode acessar um formulário no controlador (conforme indicado nos documentos ).
Exceto quando seu formulário não estiver definido no escopo do controlador e é definido em um escopo filho.
Basicamente, algumas diretivas angulares, como
ng-if
,ng-repeat
oung-include
, criarão um escopo filho isolado. Quaisquer diretivas personalizadas com umscope: {}
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 em
ng-if
torno do<form>
tag.Veja estes para mais informações:
https://groups.google.com/forum/#!topic/angular/B2uB8-9_Xbk
AngularJS - perdendo escopo ao usar ng-include
Nota: sugiro que você reescreva sua pergunta. A resposta para sua pergunta é sim, mas seu problema é um pouco diferente:
Para o qual a resposta seria simplesmente: não .
fonte
$scope.forms = {}
ename="forms.form1"
)adicione
ng-model="$ctrl.formName"
atributo ao seu formulário e, no controlador, você pode acessar o formulário como um objeto dentro do seu controlador,this.formName
fonte
Definitivamente você não pode acessar o formulário no escopo bec. não é criado. O DOM do modelo html é carregado lentamente como o construtor do controlador. a solução é assistir até que o DOM seja carregado e todo o escopo definido!
no controlador:
fonte