É possível criar um validador que pode usar vários valores para decidir se meu campo é válido?
por exemplo, se o método de contato preferido do cliente for por e-mail, o campo de e-mail deve ser obrigatório.
Obrigado.
Atualizado com código de exemplo ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
eequalTo
métodos e boa documentação!Respostas:
Para reiterar sobre os métodos que outros postaram, é assim que venho criando
FormGroup
validadores que não envolvem vários grupos.Para este exemplo, basta fornecer os nomes-chave dos campos
password
econfirmPassword
.Para
Validators
receber parâmetros, eles precisam retornar afunction
comFormGroup
ouFormControl
como parâmetro. Nesse caso, estou validando aFormGroup
.Tecnicamente, eu poderia ter validado quaisquer dois valores se soubesse suas chaves, mas prefiro nomear meu
Validators
da mesma forma que o erro que eles retornarão. A função pode ser modificada para receber um terceiro parâmetro que representa o nome da chave do erro retornado.Atualizado em 6 de dezembro de 2016 (v2.2.4)
Exemplo completo: https://embed.plnkr.co/ukwCXm/
fonte
FormGroup
para lidar com a validação de vários campos em vez de colocar umValidator
na coisa toda.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
Tentei fazer isso, mas não está funcionando. Alguma sugestão ? @DaveA resposta de Dave foi muito, muito útil. No entanto, uma pequena modificação pode ajudar algumas pessoas.
Caso precise adicionar erros aos
Control
campos, pode-se manter a própria construção do formulário e validadores:Em vez de definir um erro no
ControlGroup
, faça-o no campo real da seguinte forma:fonte
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
noelse
branch para atualizá-lo corretamente quando uma mudança parapasswordInput
tornar os dados válidos.TypeError: passwordConfirmationInput.validator is not a function
. É porque eu não criei explicitamente o FormControl com Validators.required. Deixei os validadores em branco e, em vez disso, usei o atributo "obrigatório" na entrada.{[key: string]: any}
, quesetErrors(...)
não retorna (mais?). TambémsetErrors(...)
sobrescreve todos os erros que já estão presentes, então anexei ao objeto de erro atual como:let errors = formGroup.controls[passwordConfirmationKey].errors;
andif(!errors) errors={};
anderrors['notEquivalent'] = true;
andformGroup.controls[dateControlFirst].setErrors(errors);
Ao implementar validadores para vários campos de formulário, você terá que se certificar de que os validadores são reavaliados quando cada um dos controles de formulário é atualizado. A maioria dos exemplos não fornece uma solução para esse cenário, mas isso é muito importante para a consistência dos dados e o comportamento correto.
Consulte minha implementação de um validador personalizado para Angular 2, que leva isso em consideração: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
Estou usando
otherControl.valueChanges.subscribe()
para ouvir mudanças em outro controle ethisControl.updateValueAndValidity()
para acionar outra rodada de validação quando outro controle é alterado.Estou copiando um código abaixo para referência futura:
match-other-validator.ts
Uso
Veja como você pode usá-lo com formas reativas:
Validadores mais atualizados podem ser encontrados aqui: moebius-mlm / ng-validators .
fonte
this
para? Na verdade, é bom ter uma função nomeada para fins de depuração.othercontrol.valuechanges.subscribe
não foi cancelado em qualquer lugar.valueChanges
observável quando ootherControl
for destruído, o que fará com que a assinatura também seja encerrada. No entanto, suas preocupações podem ser válidas. Eu sugeriria depurar completamente esse código com a versão mais recente do Angular usando vários casos de teste. Por favor, relate novamente se você encontrar quaisquer problemas.Estou usando o Angular 2 RC.5, mas não consegui encontrar o ControlGroup, com base na resposta útil de Dave. Descobri que o FormGroup funciona em vez disso. Então, fiz algumas pequenas atualizações nos códigos de Dave e pensei em compartilhar com outros.
Em seu arquivo de componente, adicione uma importação para FormGroup:
Defina suas entradas caso precise acessar o controle de formulário diretamente:
Em seu construtor, instancie seu formulário:
Adicione a função matchingPasswords em sua classe:
Espero que isso ajude aqueles que estão usando o RC.5. Observe que ainda não testei no RC.6.
fonte
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Muitas escavações na fonte angular, mas encontrei uma maneira melhor.
Parte HTML para grupo de senha
fonte
Para expandir a resposta de matthewdaniel, uma vez que não é exatamente correta. Aqui está um exemplo de código que mostra como atribuir corretamente um validador a um
ControlGroup
.Aqui está um exemplo prático : http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
fonte
ControlGroup
é removido em favor deFormGroup
para qualquer um que olhe para isso. Docs and Learn Angular2 ExampleAqui está outra opção que consegui propor que não depende de um subtítulo ou inteiro,
ControlGroup
mas está diretamente ligada a cada umControl
.O problema que eu tinha era que os controles que eram dependentes um do outro não estavam hierarquicamente juntos, então não consegui criar um
ControlGroup
. Além disso, meu CSS foi configurado para que cada controle aproveitasse as classes angulares existentes para determinar se exibia um estilo de erro, o que era mais complicado ao lidar com uma validação de grupo em vez de uma validação específica de controle. Tentar determinar se um único controle era válido não foi possível, uma vez que a validação foi vinculada ao grupo de controles e não a cada controle individual.No meu caso, eu queria o valor de uma caixa de seleção para determinar se outro campo seria obrigatório ou não.
Isso é construído usando o Form Builder no componente. Para o modelo de seleção, em vez de vinculá-lo diretamente ao valor do objeto de solicitação, vinculei-o às funções get / set que me permitirão manipular eventos "on change" para o controle. Então, poderei definir manualmente a validação para outro controle, dependendo do novo valor dos controles selecionados.
Aqui está a parte relevante da visualização:
A parte do componente relevante:
No meu caso, sempre tive uma validação de padrão ligada ao controle, então o
validator
é sempre definido como algo, mas acho que você pode definir ovalidator
como nulo se você não tiver nenhuma validação ligada ao controle.ATUALIZAÇÃO: Existem outros métodos de captura da mudança do modelo, como
(ngModelChange)=changeFunctionName($event)
ou inscrição para controlar as mudanças de valor, usandothis.form.controls["employee"].valueChanges.subscribe(data => ...))
fonte
Tentei a maioria dessas respostas, mas nenhuma funcionou para mim. Encontrei um exemplo funcional aqui https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
fonte
Também estava procurando por isso e acabou usando
equalTo
do pacote ng2-validation ( https://www.npmjs.com/package/ng2-validation )Aqui está um exemplo: Orientado a modelos:
Orientado por modelo:
Modelo:
fonte
Aqui está minha versão que usei para garantir que uma idade em um campo seja maior ou igual à idade em outro campo. Também estou usando grupos de formulários, então uso a
group.get
função em vez degroup.controls[]
E no componente:
fonte
Acho que sua melhor aposta, por enquanto, é criar um formgroup para manter seus controles. Quando você instancia o seu controle, passe na função para validá-lo. exemplo:
Eu sei que isso depende muito da versão do angularjs2 que você está executando. Isso foi testado contra 2.0.0-alpha.46
Se alguém tiver uma sugestão melhor como escrever um validador personalizado (que pode ser o melhor caminho a seguir) é bem-vindo.
EDITAR
você também pode usar ControlGroup e validar esse grupo por completo.
Basta editar as mensagens de acordo com o seu domínio.
fonte
A resposta de Louis Cruz foi muito útil para mim.
Para completar, basta adicionar o setErrors reset: return passwordConfirmationInput.setErrors (null);
E tudo funciona bem!
Te agradece,
Saudações,
TGA
fonte
Angular 8 Exemplo de validação no campo de confirmação de senha
Para sua informação: isso não atualizará a validação no campo passwordConfirm se o campo principal "senha" for alterado após a validação ter passado. Mas, você pode invalidar o campo de confirmação de senha quando um usuário digita no campo de senha
register.component.ts
password-confirm-validator.ts
register.component.html
fonte
Eu sugeriria usar a biblioteca
ng-form-rules
. É uma biblioteca incrível para criar todos os diferentes tipos de formulários com lógica de validação desacoplada do componente e que pode depender de alterações de valor de outras áreas no formulário. Eles têm uma ótima documentação , exemplos e um vídeo que mostra muitas de suas funcionalidades . Fazer uma validação como essa o que você está tentando fazer é trivial.Você pode verificar o README para obter informações de alto nível e um exemplo básico.
fonte
Regras de validação de correspondência de senha Angular 4.
Se você precisar controlar os erros dos campos, poderá fazê-lo.
Então você precisa declarar este método no
constructor
método Like as.Em vez de definir um erro no ControlGroup, faça isso no campo real da seguinte maneira:
Parte HTML para grupo de senha
fonte