Eu tenho um formulário com campos de entrada e configuração de validação, adicionando os required
atributos e tal. Mas, para alguns campos, preciso fazer uma validação extra. Como eu "utilizaria" a validação queFormController
controla?
A validação personalizada pode ser algo como "se esses 3 campos forem preenchidos, esse campo será obrigatório e precisará ser formatado de uma maneira específica".
Existe um método, FormController.$setValidity
mas que não se parece com uma API pública, por isso prefiro não usá-lo. Criando uma Diretiva Customizada e UtilizandoNgModelController
parece com outra opção, mas basicamente exigiria que eu criasse uma diretiva para cada regra de validação personalizada, que eu não quero.
Na verdade, marcar um campo do controlador como inválido (mantendo FormController
em sincronia) pode ser o que eu preciso no cenário mais simples para concluir o trabalho, mas não sei como fazer isso.
formName.$warning
.$$
precede as APIs não públicas, por$
serem públicas. Veja stackoverflow.com/questions/19338493/…Respostas:
Editar: adicionou informações sobre ngMessages (> = 1.3.X) abaixo.
Mensagens de validação de formulário padrão (1.0.X e superior)
Como esse é um dos principais resultados se você pesquisar no Google "Validação de formulário angular", no momento, quero adicionar outra resposta a qualquer um que vier de lá.
É "público", não se preocupe. Use-o. É para isso que serve. Se não fosse para ser usado, os desenvolvedores Angular o privatizariam em um fechamento.
Para fazer a validação personalizada, se você não quiser usar a Angular-UI como a outra resposta sugerida, basta rolar sua própria diretiva de validação.
E aqui está um exemplo de uso:
Nota: em 1.2.x é provavelmente preferível substituir
ng-if
ang-show
anteriorAqui está um link de afunilador obrigatório
Além disso, escrevi algumas entradas de blog sobre esse assunto, que entram em detalhes um pouco mais:
Validação de formulário angular
Diretivas de validação personalizadas
Edit: usando ngMessages em 1.3.X
Agora você pode usar o módulo ngMessages em vez do ngShow para mostrar suas mensagens de erro. Na verdade, ele funcionará com qualquer coisa, não precisa ser uma mensagem de erro, mas aqui está o básico:
<script src="angular-messages.js"></script>
Referência
ngMessages
na sua declaração de módulo:Adicione a marcação apropriada:
Na marcação acima,
ng-message="personForm.email.$error"
basicamente especifica um contexto para asng-message
diretivas filho. Em seguida,ng-message="required"
eng-message="email"
especificar as propriedades nesse contexto para relógio. Mais importante, eles também especificam uma ordem para verificá-los . O primeiro que encontrar na lista "verdadeira" vence e mostra essa mensagem e nenhuma das outras.E um plunker para o exemplo ngMessages
fonte
return value ? valid : undefined
acima.O projeto da Angular-UI inclui uma diretiva de validação da interface do usuário, que provavelmente o ajudará com isso. Vamos especificar uma função a ser chamada para fazer a validação.
Dê uma olhada na página de demonstração: http://angular-ui.github.com/ , pesquise até o cabeçalho Validar.
Na página de demonstração:
então no seu controlador:
fonte
Você pode usar ng-required em seu cenário de validação ("se esses 3 campos forem preenchidos, esse campo será obrigatório":
fonte
Você pode usar o Angular-Validator .
Exemplo: usando uma função para validar um campo
Então, no seu controlador, você teria algo como
Você também pode fazer algo assim:
(onde campo1 campo2 e campo3 são variáveis de escopo. Você também pode verificar se os campos não são iguais à sequência vazia)
Se o campo não passar
validator
, o campo será marcado como inválido e o usuário não poderá enviar o formulário.Para obter mais casos de uso e exemplos, consulte: https://github.com/turinggroup/angular-validator
Disclaimer: Eu sou o autor do Angular-Validator
fonte
Recentemente, criei uma diretiva para permitir a invalidação baseada em expressão de entradas de forma angular. Qualquer expressão angular válida pode ser usada e suporta chaves de validação personalizadas usando a notação de objeto. Testado com v1.3.8 angular
Você pode usá-lo assim:
Ou apenas passando uma expressão (será fornecida a validationKey padrão de "invalidIf")
fonte
Aqui está uma maneira legal de fazer validações personalizadas de expressão curinga em um formulário (em: Validação avançada de formulário com AngularJS e filtros ):
Demonstração jsFiddle (suporta nomeação de expressões e várias expressões)
É semelhante a
ui-validate
, mas você não precisa de uma função de validação específica de escopo (isso funciona genericamente) e, é claro, não precisa de ui.utils dessa maneira.fonte
Atualizar:
Versão aprimorada e simplificada da diretiva anterior (uma em vez de duas) com a mesma funcionalidade:
Exemplo de uso:
Resultado: expressões de teste mutuamente dependentes, em que validadores são executados na alteração do modelo de diretiva e modelo atual de outras pessoas.
A expressão de teste possui uma
$model
variável local que você deve usar para compará-la com outras variáveis.Anteriormente:
Fiz uma tentativa de melhorar o código @Plantface adicionando diretiva extra. Essa diretiva extra é muito útil se nossa expressão precisar ser executada quando forem feitas alterações em mais de uma variável ngModel.
Exemplo de como usá-lo para criar campos validados cruzados:
ensure-expression
é executado para validar o modelo quandong-model
ou qualquer uma dasensure-watch
variáveis é alterada.fonte
@ sinergético acho que @blesh suponha colocar função validar como abaixo
fonte
Validações personalizadas que chamam um servidor
Use a API ngModelController,
$asyncValidators
que lida com a validação assíncrona, como fazer uma$http
solicitação ao back-end. As funções adicionadas ao objeto devem retornar uma promessa que deve ser resolvida quando válida ou rejeitada quando inválida. As validações assíncronas em andamento são armazenadas por digitaçãongModelController.$pending
. Para obter mais informações, consulte o Guia do desenvolvedor do AngularJS - Formulários (validação personalizada) .Para mais informações, veja
$asyncValidators
API ngModelControllerGuia do desenvolvedor do AngularJS - Formulários (validação customizada) .
Usando a
$validators
APIA resposta aceita usa os pipelines
$parsers
e$formatters
para adicionar um validador síncrono personalizado. O AngularJS 1.3+ adicionou uma$validators
API para que não seja necessário colocar validadores nos pipelines$parsers
e$formatters
:Para obter mais informações, consulte Referência da API do AngularJS ngModelController - $ validators .
fonte
No AngularJS, o melhor local para definir a validação personalizada é a diretiva Cutsom. O AngularJS fornece um módulo ngMessages.
Para validação de formulário personalizado, deve-se usar os módulos ngMessages com diretiva personalizada.
Aqui está como criar diretiva de validação personalizada
$setValidity
é uma função embutida para definir o estado do modelo como válido / inválidofonte
Estendi a resposta de @Ben Lesh com a capacidade de especificar se a validação diferencia maiúsculas de minúsculas ou não (padrão)
usar:
código:
fonte
Alguns ótimos exemplos e bibliotecas apresentados neste tópico, mas eles não tinham o que eu estava procurando. Minha abordagem: angular-validity - uma lib de validação baseada em promessa para validação assíncrona, com o estilo Bootstrap opcional incorporado.
Uma solução de validade angular para o caso de uso do OP pode ser algo como isto:
Aqui está um violino , se você quiser dar uma volta. A lib está disponível no GitHub , possui documentação detalhada e muitas demos ao vivo.
fonte