如何在Angular的嵌套数组中进行双向数据绑定

时间:2019-01-12 13:55:12

标签: javascript angular typescript

说您有一个任务列表,而该任务列表又有一个子任务列表,并且您希望子任务是可更改的-为什么角度不能正确地双向绑定子任务的数据?

HTML

<div *ngFor="let task of tasks">
  Task value: <input [(ngModel)]="task.value">
  <br>
  <div *ngFor="let subtask of task.subtasks">
    Subtask: <input [(ngModel)]="subtask">
    </div>
</div>

{{ tasks | json }}

TS

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  tasks = [{
    value: 'Task 1',
    subtasks: ['Hello']
  }]  
}

https://stackblitz.com/edit/angular-agrzfs

2 个答案:

答案 0 :(得分:4)

这里的问题是ngFor每个输入必须具有 unique name 。要解决它,

使用 task.subtasks[index] 代替带有ngModel的项目

此外,您还需要使用trackByIndex以避免速度过慢,因为每次更改数组中的字符串时它都会重新创建DOM

<div *ngFor="let subtask of task.subtasks;let index = index;trackBy:trackByIndex;">
    Subtask: <input [(ngModel)]="task.subtasks[index]">
</div>

STACKBLITZ DEMO

答案 1 :(得分:1)

您需要像此代码段一样访问子列表的索引

在列表上添加索引计数器,并通过tas.sublist [i]

访问
   <div *ngFor="let task of tasks">
      Task value: <input [(ngModel)]="task.value">
    <br>
    <div *ngFor="let subtask of task.subtasks; let i = index">
      Subtask: <input [(ngModel)]="task.subtasks[i]">

   </div>
 </div>

{{ tasks | json }}