【问题标题】:Why I got these Error "No value accessor for form control with path: 'rowDetails -> 0 -> no'"为什么我得到这些错误“没有路径的表单控件的值访问器:'rowDetails -> 0 -> no'”
【发布时间】:2020-04-26 10:48:50
【问题描述】:

我们在尝试使用 formGroup 时会遇到一些错误。 我需要一些关于表单组的解释。 我想创建一个包含数据的表单组。 数据需要逐行显示。 我们使用角度 8 当我运行它时,我得到了这个错误:

没有路径的表单控件的值访问器:'rowDetails -> 0 -> no'

我有这个组件的构造函数:

 constructor(
    public fb: FormBuilder
    ) { 
      this.summaryForm = this.fb.group({
        rowDetails: this.fb.array([])
      })
    }

我有这个组件控制器:

ngOnInit() {
    this.productList = (this.selectedReceiptBatch.incomeSummary as SaleSummary).sales;
    this.summaryForm = this.fb.group({
      rowDetails: this.fb.array(
        this.productList.map(x=> this.fb.group({
              'no': x.product.code,
              'desc': x.product.productClass,
              'numberx': [x.number.x],
              'numbery': x.number.y,
              'amountz': x.number.z,
              'reference': [x.reference]
        })
      )) 
    });
    console.log(this.summaryForm);
    this.formControlAvailable = true;
  }

HTML:


<div *ngIf="formControlAvailable">

  <div>

    <div [formGroup]="summaryForm">
      <div formArrayName="rowDetails">
        <div *ngFor="let row of summaryForm.controls.rowDetails.controls; let index = index">
          <div [formGroupName]="index">
            <div>
              <span formControlName="no" >{{row.value.no}}</span>
            </div>            
            <div>
              <span *ngIf="row?.product?.code" formControlName="desc" >
                {{row.value.desc}}
              </span>
              <div *ngIf="!row?.product?.code" ngbDropdown class="d-inline-block">
                <mat-form-field>
                  <mat-label>Select an option</mat-label>
                  <mat-select [(value)]="row.product.code" formControlName="desc" >
                    <mat-option *ngFor="let product of cashableProducts" [value]="product.code">
                      {{product.code}}
                    </mat-option>
                  </mat-select>
                </mat-form-field>
              </div>

            </div>
            <div >
              <input type="number" [value]="row.amount.net"
                (change)="row.amount.net = parseNumber($event.target.value);calculate()" 
                formControlName='numberx' />
            </div>
            <div >
              <span formControlName='numbery' >{{ row.value.numbery }}$</span>
            </div>
            <div >
              <span formControlName='numberz' >{{ row.value.numberz }}$</span>
            </div>
            <div >
              <input formControlName='reference' type="text" class="form-control" minlength="0" [(ngModel)]="row.reference" />
            </div>
          </div>
        </div>
      </div>

    </div>
  </div>
</div>

【问题讨论】:

    标签: angular forms angular6 formarray formgroups


    【解决方案1】:

    您只能将formControlName 指令放在输入元素、选择、文本区域或实现接口值访问器接口的组件上。

    改变这个

    <span formControlName="no" >{{row.value.no}}</span>
    

    像这样输入元素

    <input type="text" formControlName="no" >
    

    如果你只想显示no

    {{row.value?.no}}
    

    【讨论】:

    • 谢谢,如果我只想使用标签的值,我们可以不输入和 formControlName 吗?因为如果我删除它会出现这个错误:Cannot find control with path: 'rowDetails -&gt; 0 -&gt; '
    • 就像这样&lt;label&gt;{{row.value?.no}}&lt;/label&gt; 可以正常工作
    • 因为如果我删除此 formControlName 和与之关联的输入,我会收到此错误。 &lt;div class="col text-center py-3"&gt; &lt;span &gt;{{row.value?.no}}&lt;/span&gt; &lt;/div&gt; :找不到带有路径的控件:'rowDetails -> 0 ->
    • 您能否与我们分享this.summaryForm 的日志值,以便我对其进行测试
    • ? @samuelcote 如果此答案解决了您的问题,请考虑通过单击复选标记投票并接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2018-03-24
    • 1970-01-01
    • 2017-04-25
    • 2021-02-28
    相关资源
    最近更新 更多