找不到路径为:'plans -> 0' 的控件

Cannot find control with path: 'plans -> 0'

我有一个 API,returns 数据类似,但 class 相同,但条目数发生变化。

HTML 文件:

<div class="col-12 col-md-6" formArrayName="plans">
  <div class="form-check" 
      *ngFor="let plan of plans; index as i" [formGroupName]="i">
    <label class="form-check-label fw7 h5 mb0">
      <input class="form-check-input" type="checkbox" formControlName="checkbox">
      {{plan.planCode}}
    </label>

    <label *ngIf="plan.divisions.length > 0">
      Divisions
      <select class="form-control" formControlName="division">
        <option *ngFor="let division of plan.divisions" [value]="division.divisionCode">
          {{division.divisionName}}
        </option>
      </select>
    </label>
  </div>         
</div>

TS 文件:

public plans: IPlan[] = new Array<Plan>();
public formControls: {
  firstNameCtrl: FormControl,    
  plans: {
    checkbox: FormControl;
    division: FormControl;
  }[]
};

ngOnInit() {
  this.restSvc.getData("/api/plan/GetPlanDetails")
    .subscribe((data => {
      if (!data.errorMessage) {
        this.plans = data;          
      } else {
        this.errMsg = data.errorMessage;
      }
    }), error => {
      this.errMsg = "We found some errors. Please review the form and make corrections.";
  });

  this.formControls = {
    firstNameCtrl: this.fb.control('', Validators.required),   
    plans: this.plans.map((plan, i) => {
      const divisionCode = plan.divisions.length > 0
        ? plan.divisions[0].divisionCode
        : '';
      return {
        checkbox: this.fb.control(i === 0),
        division: this.fb.control(divisionCode)
      };
    })
  };
}

我遇到错误

Cannot find control with path: 'plans -> 0'

计划在订阅完成之前被映射到哪里。如何解决?

示例数据:

plans = [ 
  { planCode: "B3692", divisions: [] }, 
  { planCode: "B3693", divisions: [] }, 
  { planCode: "B67", 
    divisions: [ 
      { divisionCode: "2", divisionName: "Assisted Living " }, 
      { divisionCode: "1", divisionName: "LILC" }] 
  }, 
  { planCode: "B69", 
    divisions: [ 
      { divisionCode: "3", divisionName: "Four Seasons" }, 
      { divisionCode: "2", divisionName: "Lakeside" }, 
      { divisionCode: "1", divisionName: "Sunrise" } ] 
  } 
];

您需要在服务 return 数据后构建表单。

分步考虑您的 ngOnInit 功能。

  1. 请求数据
  2. 建筑形式
  3. 从空 plans 数组构建表单数组
  4. HTML建成

...

  1. 服务return数据
  2. 更新plans数组
  3. HTML 已更新

您现在遇到的情况是 *ngFor="let plan of plans" 正在为每个 plan 创建一个 HTML 块,但您还没有向 form.plans 添加任何表单控件大批。因此,当表单尝试绑定到 form.plans 中的第一个表单控件时,它找不到任何东西并中断。

如何解决这个问题?

这里的最终问题是您的表单数组始终需要反映您正在构建它的模型,否则数组长度的差异会导致问题。

据我所知,在等待 return 计划服务时显示部分表格没有多大意义。所以我建议推迟构建表单,直到您拥有所有数据。您可以通过从订阅内部构建表单来完成此操作。

// no point in initialising with an empty array
plans: IPlan[];
formControls: {
  firstNameCtrl: FormControl,    
  plans: {
    checkbox: FormControl;
    division: FormControl;
  }[]
};

ngOnInit() {
  this.restSvc.getData("/api/plan/GetPlanDetails").subscribe(plans => {
    if (!plans.errorMessage) {
      this.plans = plans;
      this.buildForm();
    } else {
      this.errMsg = plans.errorMessage;
    }
  }, error => {
    this.errMsg = "We found some errors. Please review the form and make corrections.";
  });  
}

private buildForm(): void {
  this.formControls = {
    firstNameCtrl: this.fb.control('', Validators.required),   
    plans: this.plans.map((plan, i) => {
      const divisionCode = plan.divisions.length > 0
        ? plan.divisions[0].divisionCode
        : '';
      return {
        checkbox: this.fb.control(i === 0),
        division: this.fb.control(divisionCode)
      };
    })
  };

  // TODO: build the form here
}

您现在需要控制何时将您的表单添加到 DOM,因为您在最初构建时没有要绑定的表单。

<form *ngIf="form" [formGroup]="form">
  <!-- the form -->
</form>