typescript - Angular 2 - Enlace bidireccional con NgModel en NgFor
En Angular 2, ¿cómo obtendría la vinculación bidireccional con NgModel dentro de una lista repetitiva usando NgFor? A continuación está mi plunkr y código, pero obtengo un error.
Plunkr
@Component({
selector: 'my-app',
template: `
<div>
<div *ngFor="let item of toDos;let index = index;">
<input [(ngModel)]="item" placeholder="item">
</div>
Below Should be binded to above input box
<div *ngFor="let item of toDos">
<label>{{item}}</label>
</div>
</div>
`,
directives: [MdButton, MdInput]
})
export class AppComponent {
toDos: string[] =["Todo1","Todo2","Todo3"];
constructor() {}
ngOnInit() {
}
}
Respuesta #1
Después de investigar, necesito usar trackBy en ngFor. Plnkr actualizado y código a continuación.
Trabajando Plnkr
@Component({
selector: 'my-app',
template: `
<div>
<div *ngFor="let item of toDos;let index = index;trackBy:trackByIndex;">
<input [(ngModel)]="toDos[index]" placeholder="item">
</div>
Below Should be binded to above input box
<div *ngFor="let item of toDos">
<label>{{item}}</label>
</div>
</div>
`,
directives: [MdButton, MdInput]
})
export class AppComponent {
toDos: string[] =["Todo1","Todo2","Todo3"];
constructor() {}
ngOnInit() {
}
trackByIndex(index: number, obj: any): any {
return index;
}
}
Respuesta #2
Lo que has hecho no está funcionando por dos razones.
- Tienes que usar toDos[index] en lugar de item con ngModel (Lee para más información)
- Cada entrada debe tener un nombre único
Aquí está la solución funcional para tu problema.
<div>
<div *ngFor="let item of toDos;let index = index;">
<input name=a{{index}} [(ngModel)]="toDos[index]" placeholder="item">
</div>
Below Should be binded to above input box
<div *ngFor="let item of toDos">
<label>{{item}}</label>
</div>
