类型错误:Ng 构建后无法读取 null 的属性“_rawValidators”

Vik*_*bey 20 javascript typescript angular ng-build

我是角度新手。我正在将一些字段动态渲染为我的反应形式。当我使用模拟请求时,一切都很好ng serve(即渲染正确发生,console.log 中没有错误)。一旦我ng build使用正确的后端构建项目,我就会收到动态渲染的每个字段的错误:

main.js:1 ERROR TypeError: Cannot read property '_rawValidators' of null 
Run Code Online (Sandbox Code Playgroud)

我找不到此错误的任何背景。我很想听听你的想法。

更多背景

// these fields change with selection
this.datafields = [{
              dfId: 48,
              dfName: "Phone",
              dfType: "text",
              dfOptions: null,
              dfValue: ""
              },
              {
              dfId: 49,
              dfName: "Eval",
              dfType: "select",
              dfOptions: ["","Remote","Live"],
              df_value: "",
              }]
Run Code Online (Sandbox Code Playgroud)

打字稿渲染ngOnInit(尝试过ngAfterViewInit但没有改进)

dfGroup = new FormGroup({})
...
...

 this.eyeForm = this.formBuilder.group({
      focus: ['', Validators.required],
 datafields: this.formBuilder.array([])
})

...
...

  if (this.datafields != null || this.datafields != undefined) {
  this.datafields.forEach((x:any) => {
          this.dfGroup.setControl(x.dfName, new FormControl(x.dfValue));
        });
  this.getDataFields.push(this.dfGroup);
  }
Run Code Online (Sandbox Code Playgroud)

HTML 如下所示:

 <div [formGroup]="dfGroup">
   <div class="row pt-2" *ngFor="let field of datafields; let i=index">
      <div class="col-4 d-flex align-items-center 13required">
         {{field.dfName}}&nbsp;
      </div>
      <div class="col-6">
         <mat-form-field *ngIf="field.dfType == 'text'" appearance="outline">
            <input
            matInput
            [type]="field.dfType"
            [formControlName]="field.dfName"
            required
            />
         </mat-form-field>
         <mat-form-field
            *ngIf="field.dfType == 'select'"
            appearance="outline"
            >
            <mat-select [formControlName]="field.dfName" placeholder="">
               <mat-option
               [value]="option"
               *ngFor="let option of field.dfOptions"
               >
               {{ option }}
               </mat-option>
            </mat-select>
         </mat-form-field>
      </div>
   </div>
</div>
Run Code Online (Sandbox Code Playgroud)

小智 23

当我模拟我的模板并打错了我的 formControlName 属性时,我遇到了这种情况。

<mycomponent formControlName="bogusfieldSpelledWrong" ...>
Run Code Online (Sandbox Code Playgroud)

为什么 Angular 显示它,因为这个错误可能与组件初始化/更改表单的方式有关。

  • 除此之外,当您尝试在模板中添加表单字段时,如果表单组中不存在 formControlName,就会发生这种情况。 (6认同)

Ben*_*cot 9

这是由于视图中的表单变形造成的。

这是由乱序formArrayName、循环和formGroupName

形式(控制器)

form = <FormGroup>this.fb.group({
    hops: this.fb.array([
        this.fb.group({...}),
        ...
    ])
});
Run Code Online (Sandbox Code Playgroud)

观点(错误)

<li class="asset" *ngFor="let control of hops.controls; let i = index;">
    <div formArrayName="hops">
        <div [formGroupName]="i">
Run Code Online (Sandbox Code Playgroud)

视图(更正)

<div formArrayName="hops">
    <li class="asset" *ngFor="let control of hops.controls; let i = index;">
        <div [formGroupName]="i">
Run Code Online (Sandbox Code Playgroud)


小智 6

它必须与 formControlName 有关。检查 ts 文件和 html 文件中的表单控件名称。对于嵌套组,您可以使用 formGroupName,然后使用 formControlName。

this.yourForm = this.fb.group({
    name: [''],
    contact: this.fb.group({
      address: ['']
    }) 
})
Run Code Online (Sandbox Code Playgroud)
<form [formGroup]="yourForm">
  <input type="text" formControlName="name" />
  <div formGroupName="contact">
    <input type="text" formControlName="address" />
  </div>
</form>
Run Code Online (Sandbox Code Playgroud)