使用Angular2中的ngModel将数组从json对象绑定到表单

时间:2016-11-28 19:35:31

标签: angular typescript angular-ngmodel angular2-forms

我有一个表单来创建一个“问题”,这是一个包含答案字符串数组的对象。我的问题是我找不到将这些答案绑定到问题模型的方法

一个天真的实现将是:

import { Component  } from '@angular/core';
class Question {
  question: string;
  answers: Array<string>;
}

@Component({
  selector: 'app',
  template: `
<input type="text" [(ngModel)]="question.question">
<input type="text" *ngFor="let answer of question.answers" [(ngModel)]="answer">
`
})

export class AppComponent {
  question: Question = new Question;
  question.answers = new Array(4);
  constructor(){};
}

问题出在第二个ngModel上。 使用此解决方案,我收到错误:

zone.js:388 Unhandled Promise rejection: Cannot assign to a reference or variable! ; Zone: <root> ; Task: Promise.then ; Value: Error: Cannot assign to a reference or variable!

我想我们无法将生成的值从ngFor绑定到模型。

我也试过这些选项:

  • [(ngModel)]="question.answers[index]" - &gt;有了这个,我在let index=index;上添加了ngFor,并在输入中添加了相应的名称。这里我有我在下一段描述的错误
  • [(ngModel)]="question.answers[] - &gt;尝试使用纯HTML做同样的事情。这根本不起作用

这些都没有像我预期的那样工作:当你改变输入值时,似乎重新加载了ngFor循环。当我扩展我的解决方案以允许用户追加或删除答案时,添加答案将删除第一个答案的内容。

1 个答案:

答案 0 :(得分:4)

据我所知,您有两种选择:

1使用Object而不是数组

您可以使用ngFor和此处描述的管道迭代对象:Iterate over TypeScript Dictionary in Angular 2

@Pipe({ name: 'values',  pure: false })
export class ValuesPipe implements PipeTransform {
  transform(value: any, args: any[] = null): any {
    return Object.keys(value).map(key => value[key]);
  }
}

<div *ngFor="#value of object | values"> </div>

2为ngFor循环使用第二个数组,例如http://plnkr.co/edit/PO9ujHLWfzvYD67nDCwT?p=preview

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

export class Hero {
  id: number;
  name: string;
}

@Component({
  selector: 'my-app',
  template: `<h1>Hello {{name}}</h1>
  <div *ngFor="let count of dummyArr; let i=index">
     <input type="number" [(ngModel)]="data[i]">
  </div>
  `
})
export class AppComponent implements OnInit { 
  name = 'Angular';
  data:number[]=[];
  dummyArr:number[]=[];

  ngOnInit(){
    this.data.length=6;
    this.dummyArr.length=6;
  }
}