ngModel 双向数据绑定在 *ngFor 循环内无法正确绑定

ngModel two way databinding does not bind correctly inside a *ngFor loop

我在 ngForm 中有以下 html:

<div class="form-group form-group-flex" *ngFor="let customerRole of customerRoles; let i = index">
    <div class="role-name">
      <label for="roleName">Rolename{{i + 1}}</label>
      <input type="text" class="form-control" name='role-name' id="roleName" [(ngModel)]="customerRole.name"/>
    </div>
    <div class="hourly-wage"> // can ignore this div, works similary as role-name above
      <label for="hourlyWage">Hourly wage</label>
      <div class="input-group">
        <input type="number" class="form-control" name='hourlyWage' id="hourlyWage"
               [(ngModel)]="customerRole.hourlyWage"/>
        <div class="input-group-append">
          <span class="input-group-text ignore-radius">€</span>
        </div>
      </div>
    </div>
    <button type="button" class="btn btn-dark btn-sm" id="deleteRole" (click)="deleteRole(customerRole)" ngbTooltip="Delete role">
      <i class="fa fa-trash" aria-hidden="true"></i>
    </button>
  </div>
  <div class="row">
    <a class="add-role-icon">
      <i class="fa fa-plus" (click)="addRole()" placement="top" ngbTooltip="Add role"></i>
    </a>
    <label *ngIf="customerRoles.length === 0; else addMoreRoles">Add role</label>
    <ng-template #addMoreRoles>
      <label>Add another role</label>
    </ng-template>
  </div>
</div>

addRole() 方法如下所示:

    addRole() {
    this.customerRoles.push(createInitialRole());
  }

customerRoles 只是一个包含角色的数组。

这就是它的样子:

所以总是有一个新角色,包含一个角色名和一个小时工资,每次我按下 "add another role" 按钮时都会添加进来。 我的 ngModel 绑定有问题,每次我添加另一个角色时,由于某种原因,每个输入值都会更改为添加到 customerRoles 数组的最后一个元素的值。

所以如果我在上面的图像中添加另一个角色,它看起来像这样:

视图中的每个输入值都更改为最后添加的角色的值,在本例中包含空名称和空小时工资。出于某种原因,角色 1 和 2 在添加角色 3 后绑定到角色 3 的值。 customerRoles 数组包含正确的元素。例如,它仍然包含第 0 个索引处的初级软件开发人员角色。为什么它突然显示数组的最新添加值而不是它绑定的值?如果我使用

value="{{customerRole.name}}"
(input)="customerRole.name= $event.target.value"

而不是

[(ngModel)]="customerRole.name"

一切都按预期工作,但这是我不想采用的解决方法。

编辑:

只是为了测试目的,如果我在输入字段上方的标签中显示 customerRole.name 像这样

<label for="roleName">{{customerRole.name}}</label>
<input type="text" class="form-control" name='role-name' id="roleName" [(ngModel)]="customerRole.name"/>

标签保持显示正确的值,而输入字段切换到如前所述添加的最后一个元素的值。

ngFor 生成的 HTML 将不正确,因为所有 roleName 输入都具有相同的 nameid。我认为这可能会导致 ngFor 出现异常。

由于这部分... name='role-name' id="roleName" ...(其他部分也一样)

删除名称和 ID(或使它们在每次迭代中都是唯一的),所有这些都应该再次起作用