【问题标题】:angular 4 nested formArray / formGroup put value back in form from DB query角度 4 嵌套的 formArray / formGroup 从 DB 查询中将值放回表单中
【发布时间】:2018-05-24 02:14:36
【问题描述】:

我有一个嵌套的 for 数组。我想编辑表单中的值,因此我进行了数据库查询以获取要编辑的值,但我无法将它们(personRows3 值)放在正确的输入字段中。 personRows3 是一个嵌套表单数组,它有一个或多个表单组(personI3、personR3),请参见下面的seg_inf。
我收到一个错误:
Error: Cannot find control with path: 'segmentRows3 -> 0 '
这是.html代码

<form *ngIf="row" [formGroup]="myEditSummaryForm" (ngSubmit)="saveASummary(myEditSummaryForm.value)">
<div class="container">
<div formArrayName="segmentRows3">
  <div *ngFor=" let seg of seg_inf; let i= index " > 
    <div  class="form-group" [formGroupName]="i" >    <---error line----
      <label for="segmentId3">Segment ID {{i+1}}  
        <input type="text" formControlName="segmentId3" id="segmentId3" class="form-control" value="{{i+1}}" >          
      </label>   
      <label><span *ngIf="seg_inf.length > 1" (click)="deleteSegment(i)" class="btn btn-danger">Remove segment</span></label>
      <label for="segmentTime3">Segment time : 
        <timepicker formControlName="segmentTime3" (ngModel)="segmentTime3" [showMeridian]="isMeridian" [showSpinners]="showSpinners"> </timepicker> </label> 
      <button type="button" (click)="addPerson(i)" class="btn btn-info">Add a person</button>
       {{seg.personRows3 |json}}<br>
      <div formArrayName="personRows3">
        <div *ngFor=" let per of seg.personRows3; let j=index " > 
          <div class="form-group" [formGroupName]="j">   #{{j+1}}   
            <label for="personR3">Segment type 
              <input formControlName="personR3" [typeahead]="personRole" type="text" id="personR3" class="form-control">
            </label>
            <label for="personI3">Person name   
              <input formControlName="personI3" [typeahead]="states" type="text" id="personI3" class="form-control">
            </label>
            <label><span *ngIf="seg_inf.length > 1" (click)="deletePerson(i,j)" class="btn btn-warning">Remove</span></label>
          </div>
        </div>
      </div>
      <label for="topic">Topic</label>
        <textarea formControlName="topic" id="topic" class="form-control" (ngModelChange)="onChange($event)"></textarea>  
    </div>            
  </div>
</div>
<button type="button" (click)="addSegment(i)" class="btn btn-primary">Add a segment</button>  
</div>
 <div>
  <button class="btn btn-success form-control" 
(click)="saveASummary(myEditSummaryForm.value)"> Save update(s)</button>
 </div>             
</form> 

这是.ts代码

for (var i = 0, len = this.seg_inf.length; i < len; i++) {
  let segmentRows3 = <FormArray>this.myEditSummaryForm.get('segmentRows3');
  segmentRows3.push(
    this.fb.group({
    segmentTime3: this.seg_inf[i].segmentTime3, 
    segmentId3: i+1, 
    topic: this.seg_inf[i].topic,    
    PersonRows3: this.getPerson(this.seg_inf, i),       //function call
      })
    );
  }    


 getPerson(s_i: any[], index: number) {
let s_i_prl = s_i[index].personRows3.length;
let s_i_pr = s_i[index].personRows3;
// get all people for that segment
for (var j = 0, lenj=s_i_prl; j < lenj; j++) {
  let personRows3 = <FormArray>this.myEditSummaryForm.get(`segmentRows3.${index}.personRows3`)
  this.fb.array([
    this.fb.group({
        personR3: s_i_pr[j].personR3,
        personI3: s_i_pr[j].personI3, 
        })
    ])
  }
}   


this.seg_inf = [{"segmentTime3":"2018-05-23T14:20:00.051Z","segmentId3":"","topic":"topic1",   
"personRows3":[{"personR3":"HS - host","personI3":"California"},{"personR3":"GS - guest","personI3":"Alaska"}]},   
 {"segmentTime3":"2018-05-23T14:30:00.533Z","segmentId3":"","topic":"topic2",   
 "personRows3":[{"personR3":"HS - host","personI3":"Arizona"}]}]   

在我尝试填写 personRows3 的输入字段之前,一切正常!
你可以看到:{{seg.personRows3 |json}} 在Add a person button 之后

这是nonworking code。我错过了什么?

@yurzui 回答后:

【问题讨论】:

    标签: javascript angular path nested-forms formarray


    【解决方案1】:

    它不应该像你的 getPerson 方法那样复杂,实际上不返回任何东西。

    您可以使用以下代码:

    personRows3: this.getPerson(this.seg_inf[i].personRows3);
    ...
    
    getPerson(personRows: any[]) {
      return this.fb.array(
        personRows.map(p => this.fb.group({
          personR3: p.personR3,
          personI3: p.personI3,
        })
      ))
    }
    

    在这里,我返回 FormArray 中的 FormGroups,它们基于您的 personRows3 数组。

    您也可以在Ng-run Example

    中查看

    【讨论】:

    • 非常感谢您的帮助。但我得到另一个错误:Error: Cannot find control with path: 'segmentRows3 -&gt; 0 -&gt; personRows3' 并且它没有通过 personRows3 循环查看有问题的图像。谢谢
    • 你能检查一下吗? stackblitz.com/edit/…
    • 我看不出有什么不同。请你看看这个:stackblitz.com/edit/… 这就是所有的应用程序!你会在控制台看到错误Error: Cannot find control with path: 'segmentRows3 -&gt; 0 -&gt; personRows3'Thanks
    • PersonRows3 中的第一个字母应该小写
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2018-08-14
    • 1970-01-01
    • 2019-08-03
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多