Angular 11 个自定义 ISBN 验证器反应表单

Angular 11 Custom ISBN Validator Reactive Forms

我正在对 ISBN 编号进行自定义验证,我已经拥有检查编号的功能并且可以完美地通过控制台给我响应,但我需要执行自定义验证程序以获取错误使用表单控件查看,在这一步中,当我写一个 ISBN 编号时,这个错误显示在控制台中,就像它检查错误但它不知道什么时候正确,它应该将空响应作为正确的 ISBN 编号,至少那是我在一些例子中看到的。

core.js:6210 ERROR TypeError: Cannot read properties of null (reading 'CheckDigit')
at LibrosComponent_Template (libros.component.html:22)
at executeTemplate (core.js:9600)
at refreshView (core.js:9466)
at refreshComponent (core.js:10637)
at refreshChildComponents (core.js:9263)
at refreshView (core.js:9516)
at refreshEmbeddedViews (core.js:10591)
at refreshView (core.js:9490)
at refreshComponent (core.js:10637)
at refreshChildComponents (core.js:9263)

这是我的打字稿,

export class LibrosComponent implements OnInit {

 //ISBN Validator
 isbnValue: string = ""
 
 firstFormGroup: FormGroup;
 secondFormGroup: FormGroup;

  constructor(
   private _formBuilder: FormBuilder,
 ) {}

 ngOnInit() {
   this.firstFormGroup = this._formBuilder.group({
     tituloControl: ['', Validators.required],
     isbnControl: ['', Validators.required],
   },
   { validator: this.isbnValidate });    
 }
 
 isbnValidate(g: FormGroup) {
     var isbnValue = g.get('isbnControl').value
     var subject = isbnValue;

     // Checks for ISBN-10 or ISBN-13 format
   var regex = /^(?:ISBN(?:-1[03])?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$/;

   if (regex.test(subject)) {
       // Remove non ISBN digits, then split into an array
       var chars = subject.replace(/[- ]|^ISBN(?:-1[03])?:?/g, "").split("");
       // Remove the final ISBN digit from `chars`, and assign it to `last`
       var last = chars.pop();
       var sum = 0;
       var check, i;

       if (chars.length == 9) {
           // Compute the ISBN-10 check digit
           chars.reverse();
           for (i = 0; i < chars.length; i++) {
               sum += (i + 2) * parseInt(chars[i], 10);
           }
           check = 11 - (sum % 11);
           if (check == 10) {
               check = "X";
           } else if (check == 11) {
               check = "0";
           }
       } else {
           // Compute the ISBN-13 check digit
           for (i = 0; i < chars.length; i++) {
               sum += (i % 2 * 2 + 1) * parseInt(chars[i], 10);
           }
           check = 10 - (sum % 10);
           if (check == 10) {
               check = "0";
           }
       }

       if (check != last) {
         return null;
           
       } else {
         return  g.get('isbnControl').setErrors( {CheckDigit: true} )
           
       }
     } else {
       return g.get('isbnControl').setErrors( {Invalid: true} );
   }

 }
}

在我的 HTML 中,我有一些包含在表单中的输入:

<form class="form" [formGroup]="firstFormGroup">  
          <div class="container-1">
            <mat-form-field class="width">
              <mat-label>Título</mat-label>
              <input matInput formControlName="tituloControl" required>
            </mat-form-field>

            <mat-form-field class="width">
                <mat-label>ISBN</mat-label>
                <input matInput formControlName="isbnControl" required>
                <mat-error *ngIf="firstFormGroup.controls['isbnControl'].pristine || firstFormGroup.controls.isbnControl.errors['CheckDigit']">Invalid ISBN check digit</mat-error>
                <mat-error *ngIf="firstFormGroup.controls['isbnControl'].pristine || firstFormGroup.controls.isbnControl.errors['Invalid']">Invalid ISBN</mat-error>
            </mat-form-field>
</form>

我已经找到错误的解决方法,将.errors['']换成hasError(''),.errors[]是读取包含validation的对象的属性错误。但首先我必须使用 hasError () 方法评估 属性 是否存在才能访问它。