Eu tenho este formulário: http://jsfiddle.net/dfJeN/
Como você pode ver, o valor do nome para a entrada é definido estaticamente:
name="username"
, a validação do formulário funciona bem (adicione algo e remova todo o texto da entrada, um texto deve aparecer).
Em seguida, tento definir dinamicamente o valor do nome: http://jsfiddle.net/jNWB8/
name="{input.name}"
Então eu aplico isso à minha validação
login.{{input.name}}.$error.required
(este padrão será usado em uma repetição de ng), mas a validação do meu formulário está quebrada. Ele foi interpretado corretamente no meu navegador (se eu inspecionar o elemento, vi login.username. $ Error.required).
Qualquer ideia ?
EDITAR: Após registrar o escopo no console, parece que o
{{input.name}}
expressão não é interpolar. Meu formulário como um atributo {{input.name}}, mas sem nome de usuário.
ATUALIZAÇÃO: Desde 1.3.0-rc.3 name = "{{input.name}}" funciona como esperado. Por favor, veja # 1404
Respostas:
Você não pode fazer o que está tentando fazer dessa maneira.
Assumindo que o que você está tentando fazer é adicionar elementos dinamicamente a um formulário, com algo como uma repetição de ng, você precisa usar o formulário de ng aninhado para permitir a validação desses itens individuais:
Infelizmente, não é apenas um recurso bem documentado do Angular.
fonte
O uso de ngForm aninhado permite acessar o InputController específico de dentro do modelo HTML. No entanto, se você deseja acessá-lo de outro controlador, isso não ajuda.
por exemplo
Eu uso esta diretiva para ajudar a resolver o problema:
Agora você usa nomes dinâmicos sempre que necessário, apenas o atributo 'nome-dinâmico' em vez do atributo 'nome'.
por exemplo
fonte
$interpolate
vez de$parse
, me senti mais útil<form ng-repeat="item in items" dynamic-name="'item'+item.id"> ... <span ng-show="item{{item.id}}.$invalid">This form is invalid</span></form>
?O problema deve ser corrigido no AngularJS 1.3, de acordo com esta discussão no Github .
Enquanto isso, aqui está uma solução temporária criada por @caitp e @Thinkscape :
Demo no JSFiddle .
fonte
Legal do @EnISeeK .... mas eu fiz para ser mais elegante e menos intrusivo para outras diretivas:
fonte
Apenas uma pequena melhoria em relação à solução EnlSeek
Aqui está um teste de êmbolo . Aqui está a explicação detalhada
fonte
Eu expandi a solução @caitp e @Thinkscape um pouco, para permitir formulários ng aninhados criados dinamicamente , como este:
Aqui está minha demonstração no JSFiddle .
fonte
Usei a solução de Ben Lesh e funcionou bem para mim. Mas um problema que enfrentei foi que quando adicionei um formulário interno usando
ng-form
, todos os estados do formulário, por exemplo,form.$valid, form.$error
etc, tornaram-se indefinidos se eu estivesse usando ong-submit
diretiva.Então, se eu tivesse isso, por exemplo:
E no meu controlador:
Então, tive que voltar a usar um evento de clique regular para enviar o formulário, caso em que é necessário passar o objeto do formulário:
E o método do controlador revisado:
Não tenho certeza do porquê, mas espero que ajude alguém.
fonte
Este problema foi corrigido no Angular 1.3+. Esta é a sintaxe correta para o que você está tentando fazer:
fonte
fonte