ngModel 在 ng-For 中使用时覆盖以前的值

ngModel Overwrites the previous value while using in ng-For

这是我的 html 文件

<form [formGroup]='itemUpdateForm'>
      <div class="row">
        <mat-form-field class="col-sm-8">
            <mat-label>Restaurant Name:</mat-label>
            <input matInput type="text" required  [(ngModel)]="this.restuarantService.selectedProduct.name"   placeholder="Enter Restaurant Name" formControlName='name'>
        </mat-form-field>
      </div>

      <div class="row" *ngFor='let index of counter(this.restuarantService.selectedProduct.Items.length) ;let i = index' formGroupName='Items'>
        <mat-form-field class="col-sm-5">
          <mat-label>Food Name:</mat-label>          
          <input matInput type="text" required  [(ngModel)]='this.restuarantService.selectedProduct.Items[i].foodName'   placeholder="Enter Food Name" formControlName='foodName'>
      </mat-form-field>
      <mat-form-field class="col-sm-5" >
        <mat-label>Price:</mat-label>
        <input matInput type="text" required  [(ngModel)]="this.restuarantService.selectedProduct.Items[i].price"   placeholder="Enter Price" formControlName='price'>
      </mat-form-field>
      </div>
      
    </form>

我的输出看起来像这样 Output

最后一个值会覆盖所有字段中以前的值。所以我得到了所有字段中的最后一个值..我想显示 order.What 中的所有值我需要做的更改

Venkatesh,你有一个类型错误。如果你使用 formBuilder,是

this.formBuilder.group({
 name: this.restuarantService.selectedProduct.name
 ...
})

如果您使用 FormGroup 和 FromControl 的构造函数,您将使用

new FormGroup({
 name: new FormControl({value:this.restuarantService.selectedProduct.name})
 ...
})

new FormGroup({
 name: new FormControl(this.restuarantService.selectedProduct.name)
 ...
})

你的代码中的另一个问题是你需要为“项目”使用 FormArray,参见例如this SO

更新看到它总是一样

1.- 创建一个 getter 即 return formArray

  get itemsArray()
  {
    return this.itemUpdateForm.get('Items') as FormArray
  }

2.-创建一个辅助函数,允许我们创建一个formGroup

  createGroupItem(data:any=null)
  {
    data=data || {foodName:'',price:0}
    return this.formBuilder.group({
      foodName:data.foodName,
      price:data.price
    })
  }

在 setValue 之前,您需要将如此多的元素添加到 formArray 作为“items”

setValue() {
    //before setValue, to a FormArray you need that the 
    //formArray has as many element as the data
    this.restuarantService.selectedProduct.Items.forEach(
          x=>this.itemsArray.push(this.createGroupItem()))

    //if the object not match exactly with the object use patchValue, not setValue
    //see how we pass the "Items", simply indicate the items
    this.itemUpdateForm.patchValue({
      name: this.restuarantService.selectedProduct.name,
      Items: this.restuarantService.selectedProduct.Items
    });
  }

.html

<!--a div with formArrayName-->
<div formArrayName="Items">
    <!--iterating over the formArray.controls using the getter
        and use [formGroupName] -->
    <div *ngFor="let control of itemsArray.controls;let i=index"
            [formGroupName]="i">

        <!--the inputs with formControlName, see that in this case 
            is not enclosed by []-->
        <input formControlName="foodName">
        <input formControlName="price">
    
    </div>
</div>

你的 forked stackblitz 有变化

注意:我真的很喜欢创建一个新函数,return formGroup 完全

createGroup(data:any=null)
{
   data=data ||{name:'',Items:null)
   return this.formBuilder.group({
        name:data.name,
        Items:data.items?this.formBuilder.array(
               items.map(x=>this.createGroupItem(x)):
       this.formBuilder.array([])
   })
}

并且在 ngOnInit()

itemUpdateForm=this.createGroup(his.restuarantService.selectedProduct)