我正在使用Angular CLI 9.0.7运行应用程序。在此应用程序中,存在带有一组需要验证的控件的表单。为此,我创建了一个可重复使用的自定义验证器。
我的问题是该方法中的代码永远不会执行。
如何正确调用isCpf方法并遵循良好做法?
这是我的组件
pessoaFisicaFormGroup: this.formBuilder.group({
numeroCpfForm: ['', [Validators.required, CpfValidator.cpfValido]],
numeroRgForm: ['', [Validators.required]],
estadoEmissorRgForm: ['', Validators.required],
}, { validator: RgValidator.rgValido }), // I want run this validation and get two controls to validate
这是我的HTML组件
<div formGroupName="pessoaFisicaFormGroup" *ngIf="pessoaFisica" class="row">
<div class="form-group col-sm-12 col-md-6 col-lg-6 col-xl-6">
<label for="numeroCpfForm">CPF</label>
<input formControlName="numeroCpfForm"
id="numeroCpfForm"
type="text"
class="form-control"
[ngClass]="{ 'is-invalid': formErrors.numeroCpfForm }"
/>
<div *ngIf="formErrors.numeroCpfForm" class="invalid-feedback">
<div>{{formErrors.numeroCpfForm}}</div>
</div>
</div>
<div class="form-group col-sm-12 col-md-3 col-lg-4 col-xl-4">
<label for="numeroRgForm">RG</label>
<input formControlName="numeroRgForm"
id="numeroRgForm"
type="text"
class="form-control"
[ngClass]="{ 'is-invalid': formErrors.numeroRgForm || formErrors.pessoaFisicaFormGroup }"
/>
<div *ngIf="formErrors.numeroRgForm || formErrors.pessoaFisicaFormGroup" class="invalid-feedback">
<div>{{ formErrors.numeroRgForm ? formErrors.numeroRgForm : formErrors.pessoaFisicaFormGroup}}</div>
</div>
</div>
<div class="form-group col-sm-12 col-md-3 col-lg-2 col-xl-2">
<div class="form-group">
<label for="estadoEmissorRgForm">Estado Emissor</label>
<select formControlName="estadoEmissorRgForm"
id="estadoEmissorRgForm"
class="form-control"
[ngClass]="{ 'is-invalid': formErrors.estadoEmissorRgForm }"
>
<option selected></option>
<option *ngFor="let estado of estados" value="{{estado}}">{{estado}}</option>
</select>
<div *ngIf="formErrors.estadoEmissorRgForm" class="invalid-feedback">
<div>{{formErrors.estadoEmissorRgForm}}</div>
</div>
</div>
</div>
</div>
,这是我的自定义验证器。
static rgValido(groupControl: AbstractControl): any | null {
return (groupControl: AbstractControl): { [key: string]: any } | null => {
// This block never is executed, why?
//
const numeroRgControl: AbstractControl = groupControl.get('numeroRgForm');
const estadoEmissorRgControl: AbstractControl = groupControl.get('estadoEmissorRgForm');
if (!numeroRgControl) {
throw "rgValido::O campo 'numeroRgForm' não está definido no formulário.";
}
if (!estadoEmissorRgControl) {
throw "rgValido::O campo 'estadoEmissorRgForm' não está definido no formulário.";
}
console.log("achou os caras");
const numeroRg: string = numeroRgControl.value;
const estadoEmissorRg: string = estadoEmissorRgControl.value;
if (numeroRg === '' || estadoEmissorRg === '') {
return null;
}
else {
if (RgValidator.isRg(numeroRg, estadoEmissorRg)) {
null;
}
else {
return { 'numeroRgValido': false };
}
}
};
}
我相信这里就是错误
static rgValido(groupControl: AbstractControl): any | null {
console.log("this message is printed");
return (groupControl: AbstractControl): { [key: string]: any } | null => {
console.log("but this message no, because return before execute this statement");
const numeroCpfControl: AbstractControl = groupControl.get('numeroCpfForm');
const numeroRgControl: AbstractControl = groupControl.get('numeroRgForm');
const estadoEmissorRgControl: AbstractControl = groupControl.get('estadoEmissorRgForm');
if (!numeroRgControl) {
throw "rgValido::O campo 'numeroRgForm' não está definido no formulário.";
}
if (!estadoEmissorRgControl) {
throw "rgValido::O campo 'estadoEmissorRgForm' não está definido no formulário.";
}
console.log("achou os caras");
const numeroRg: string = numeroRgControl.value;
const estadoEmissorRg: string = estadoEmissorRgControl.value;
if (numeroRg === '' || estadoEmissorRg === '') {
return null;
}
else {
if (RgValidator.isRg(numeroRg, estadoEmissorRg)) {
null;
}
else {
return { 'numeroRgValido': false };
}
}
};
}
答案 0 :(得分:0)
问题已解决。我只是不再返回任何函数。
这可能不是最优雅的解决方案,但至少可以节省时间。谢谢大家。
static rgValido(groupControl: AbstractControl): any | null {
const numeroRgControl: AbstractControl = groupControl.get('numeroRgForm');
const estadoEmissorRgControl: AbstractControl = groupControl.get('estadoEmissorRgForm');
if (!numeroRgControl) {
throw "rgValido::O campo 'numeroRgForm' não está definido no formulário.";
}
if (!estadoEmissorRgControl) {
throw "rgValido::O campo 'estadoEmissorRgForm' não está definido no formulário.";
}
const numeroRg: string = numeroRgControl.value;
const estadoEmissorRg: string = estadoEmissorRgControl.value;
if (numeroRg === '' || estadoEmissorRg === '') {
return null;
}
else {
if (RgValidator.isRg(numeroRg, estadoEmissorRg)) {
null;
}
else {
return { 'rgValido': false };
}
}
}