Componente a nível de formulário
Essa estratégia é muito parecida com a anterior, porém é necessário apenas um componente no formulário. O erro recebido do servidor é inserido diretamente no campo de controle do formulário, funcionando como se fosse um erro de validação client side.
Passos
- Criar o componente que ao receber os erros do servidor, injeta o erro diretamente no campo de controle do formulário. Será utilizado o nome 'remote' para diferenciar dos erros de validação client side.
- Disponibilizar o componente criado através do módulo Shared (declarations e exports). Isso faz com que o componente esteja disponível para todos os módulos da aplicação;
- Utilizar o componente no template do formulário;
- Exibir as mensagens de erro;
Exemplo de implementação
1. Criar componente que trata o erro vindo do servidor e injeta nos campos de controle do formulário;
import { Component, Input } from '@angular/core';
import { NgForm } from '@angular/forms';
import { Http } from '@angular/http';
import { Subscription } from 'rxjs/Subscription';
import { ExceptionService } from '@demoiselle/http';
@Component({
selector: 'error-form',
template: `
<div></div>
`
})
export class ErrorFormComponent {
validationSubscription: Subscription;
@Input() form: NgForm;
constructor(private http: Http, private exceptionService: ExceptionService) {}
ngOnInit() {
this.validationSubscription = this.exceptionService.validation$.subscribe(
error => this.processValidation(error)
);
}
ngOnDestroy() {
this.validationSubscription.unsubscribe();
}
processValidation(errors: any) {
for (let error of errors) {
console.log(error);
console.log(this.form.controls);
if (this.form.controls[error.error_field]) {
console.log(this.form.controls[error.error_field]);
this.form.controls[error.error_field].setErrors({remote: error.error_description});
}
}
}
}
2. Disponibilizar o componente criado através do módulo Shared (declarations e exports);
import { ErrorFormComponent } from './error-form.component';
@NgModule({
...
declarations: [ErrorFormComponent ...]
exports: [ErrorFormComponent ...]
})
export class SharedModule { }
3. Utilizar o componente no template
<form #todoForm="ngForm">
<!-- definição do formulário-->
<!-- no final do form inserir o componente de validação-->
<error-form [form]="todoForm"></error-form>
</form>
4. Exibir as mensagens de erro
Neste exemplo utilizaremos apenas uma div que apresentará os erros remote dos campos de controle do formulário. Caso o campo dateEnd receba erros de validação remote pelo componente, eles serão exibidos:
<div class="form-group">
<label for="todo-data" class="col-sm-2 control-label">Data:</label>
<div class="col-sm-10">
<input id="todo-data" type="date" name="dateEnd" class="form-control" required [(ngModel)]="todo.dateEnd" #dateEnd="ngModel"/>
</div>
<div *ngIf="dateEnd.errors && dateEnd.errors.remote">
Remote: {{dateEnd.errors.remote}}
</div>
</div>