Como posso exigir condicionalmente entradas de formulário com o AngularJS?

234

Suponha que estamos construindo um aplicativo de catálogo de endereços (exemplo artificial) com AngularJS.

Temos um formulário para contatos que possui entradas para e-mail e número de telefone e queremos exigir um ou outro , mas não ambos : Queremos que a emailentrada seja necessária apenas se a phoneentrada estiver vazia ou inválida e vice-versa.

Angular tem uma requireddiretiva, mas não está claro na documentação como usá-lo neste caso. Então, como podemos exigir condicionalmente um campo de formulário? Escrever uma diretiva personalizada?

Christian Smith
fonte

Respostas:

463

Não há necessidade de escrever uma diretiva personalizada. A documentação da Angular é boa, mas não completa. De fato , existe uma diretiva chamada ngRequired, que recebe uma expressão angular.

<input type='email'
       name='email'
       ng-model='contact.email' 
       placeholder='[email protected]'
       ng-required='!contact.phone' />

<input type='text'
       ng-model='contact.phone'             
       placeholder='(xxx) xxx-xxxx'
       ng-required='!contact.email' />  

Aqui está um exemplo mais completo: http://jsfiddle.net/uptnx/1/

Christian Smith
fonte
5
Não deveria ser um problema, certo? Apenas atualize os condicionais de acordo. Se você explicar o que você precisa de um pouco mais de I (ou outra pessoa aqui) será capaz de mostrar-lhe :)
Puce
1
Como uma observação lateral, você também pode usar uma função e fazer lógica mais complexa lá.
Leandro Zubrezki
1
Este recurso está documentado até agora: docs.angularjs.org/api/ng/directive/ngRequired
bjunix
25

se você quiser colocar uma entrada necessária se outra for escrita:

   <input type='text'
   name='name'
   ng-model='person.name'/>

   <input type='text'
   ng-model='person.lastname'             
   ng-required='person.name' />  

Saudações.

David Gonzalez
fonte
14

Simples, você pode usar a validação angular como:

 <input type='text'
   name='name'
   ng-model='person.name'
   ng-required='!person.lastname'/>

   <input type='text'
   name='lastname'
   ng-model='person.lastname'             
   ng-required='!person.name' /> 

Agora você pode preencher o valor em apenas um campo de texto. Você pode preencher o nome ou o sobrenome. Dessa forma, você pode usar o preenchimento obrigatório condicional em AngularJs.

Bipin Shilpakar
fonte
Ainda é possível preencher os dois campos, não é?
myTerminal 15/09/17
sim usuário pode tanto preencher o campo, também nesta condição se o usuário preenchimento campo um, o outro campo não é obrigatório
Bipin Shilpakar
13

Para Angular2

<input type='email' 
    [(ngModel)]='contact.email'
    [required]='!contact.phone' >
Laffuste
fonte
EDIT: Isso está gerando um erro de console "ExpressionChangedAfterItHasBeenCheckedError: Expression mudou após a verificação." quando eu checo o botão de opção, estou aplicando isso, mas parece fazer a validação condicional.
21818 Eric Soyke
4
Angular2 + não está marcado nesta pergunta. Como é essencialmente uma estrutura diferente, essa resposta não é relevante.
Isherwood #
1
@isherwood você está certo. Eu adicionei porque terminei aqui enquanto pesquisava sobre isso. Eu vou excluí-lo se for votado como negativo ou controverso.
Laffuste 9/08
@Iaffuste, você pode postar e responder a uma nova pergunta do Angular2 + para facilitar as pessoas que estudam isso. +1 de qualquer maneira =)
arjel 28/09