Eu tenho uma forma reativa em Angular como abaixo:
this.AddCustomerForm = this.formBuilder.group({
Firstname: ['', Validators.required],
Lastname: ['', Validators.required],
Email: ['', Validators.required, Validators.pattern(this.EMAIL_REGEX)],
Picture: [''],
Username: ['', Validators.required],
Password: ['', Validators.required],
Address: ['', Validators.required],
Postcode: ['', Validators.required],
City: ['', Validators.required],
Country: ['', Validators.required]
});
createCustomer(currentCustomer: Customer)
{
if (!this.AddCustomerForm.valid)
{
//some app logic
}
}
this.AddCustomerForm.valid retorna falso, mas tudo parece bom.
Eu tentei descobrir com a verificação da propriedade de status na coleção de controles. Mas eu me pergunto se existe uma maneira de localizar os inválidos e exibi-los ao usuário?
Respostas:
Você pode simplesmente iterar em cada controle e verificar o status:
public findInvalidControls() { const invalid = []; const controls = this.AddCustomerForm.controls; for (const name in controls) { if (controls[name].invalid) { invalid.push(name); } } return invalid; }
fonte
findInvalidControls()
você retorna?Acabei de lutar contra este problema: cada campo do formulário é válido, mas ainda assim o próprio formulário é inválido.
Acontece que eu tinha definido 'Validator.required' em um FormArray onde os controles são adicionados / removidos dinamicamente. Portanto, mesmo que o FormArray estivesse vazio, ele ainda era necessário e, portanto, o formulário sempre era inválido, mesmo se todos os controles visíveis fossem preenchidos corretamente.
Eu não encontrei a parte inválida do formulário, porque minha função 'findInvalidControls' verificou apenas FormControl's e não FormGroup / FormArray. Então eu atualizei um pouco:
fonte
Um controle Angular inválido possui a classe CSS chamada 'ng-invalid' .
Em DevTools no Chrome, selecione a guia Console.
No prompt do console, digite o comando:
A saída deve ser semelhante a esta:
Nesse caso, o texto sublinhado é para o controle do formulário
listen-address
. E o texto circulado:.ng-invalid
indica que o controle é inválido.fonte
Os formulários e todos os seus controles estendem a classe angular AbstractControl. Cada implementação possui um acessador para os erros de validação.
A documentação da API contém todas as referências https://angular.io/api/forms/AbstractControl
Editar
Achei que o acessador de erro funcionasse dessa maneira, no entanto, este link para o github mostra que há algumas outras pessoas que pensaram o mesmo que eu https://github.com/angular/angular/issues/11530
Em qualquer caso, usando o acessador de controles, você pode iterar sobre todos os formControls em seu formulário.
fonte
Agora, no angular 9, você pode usar o método markAllAsTouched () para mostrar os validadores de controles inválidos:
fonte
Se você não tiver muitos campos no formulário, pode simplesmente F12 e passar o mouse sobre o controle, você poderá ver o pop-up com os valores pristine / Touch / valid do campo- "# fieldname.form-control.ng- untouched.ng-invalid ".
fonte
Acho que você deve tentar usar
this.form.updateValueAndValidity()
ou tentar executar o mesmo método em cada um dos controles.fonte
tente isso
fonte
Isso irá registrar todos os nomes dos controles 😊
for (let el in this.ReactiveForm.controls) { if (this.ReactiveForm.controls[el].errors) { console.log(el) } }
você pode fazer uma matriz ou string com isso e exibir para o usuário
fonte
Tomei a liberdade de melhorar o código do AngularInDepth.com , de modo que ele também procure entradas inválidas em formulários aninhados de maneira recursiva. Seja aninhado por FormArray-s ou FormGroup-s. Basta inserir o formGroup de nível superior e ele retornará todos os FormControls que são inválidos.
Você pode possivelmente ignorar algumas das verificações do tipo "instanceof", se separar a verificação do FormControl e a adição à funcionalidade de array inválido em uma função separada. Isso faria com que a função parecesse muito mais limpa, mas eu precisava de uma opção de função única e global para obter um array simples de todos os formControls inválidos e esta é a solução!
Apenas para aqueles que precisam, para que não tenham que codificar sozinhos.
Editar # 1
Foi solicitado que ele também retornasse FormArray-s e FormGroups inválidos, então se você também precisar disso, use este código
fonte
você pode registrar o valor do formulário
console.log(this.addCustomerForm.value)
, ele consolará todos os valores do controle e os campos nulos ou "" (vazio) indicam controles inválidosfonte
Se quiser verificar se o formulário é válido ou não e não quiser fazer nenhuma alteração no código, você pode tentar executar o seguinte comando no console da ferramenta de desenvolvedor do Chrome. Certifique-se de que seu aplicativo angular esteja exibindo o componente que hospeda o formulário em questão.
ng.probe(document.querySelector("app-your-component-selector-name")).componentInstance;
Não se esqueça de substituir o nome do seletor de componente no comando acima.
Este comando irá listar todas as variáveis de seu componente, incluindo
AddCustomerForm
. Agora, se você expandir isso, verá uma lista de todos os seus controles. Você pode então expandir cada controle para verificar se ele é válido ou não.fonte
Verifique o valor de controle de formulário vazio ou nulo na página html
Valor dos controles do formulário: {{formname.value | json}}fonte