【问题标题】:Bind array from a json object to a form using ngModel in Angular2在Angular2中使用ngModel将数组从json对象绑定到表单
【发布时间】:2017-04-12 15:15:54
【问题描述】:

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

一个简单的实现是:

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

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

【问题讨论】:

    标签: angular typescript angular-ngmodel angular2-forms


    【解决方案1】:

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

    1 使用对象而不是数组

    您可以使用 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;
      }
    }
    

    【讨论】:

    • 得到它......这家伙用第二个数组做了它,但我觉得有点奇怪......plnkr.co/edit/PO9ujHLWfzvYD67nDCwT?p=preview你真的需要一个数组还是你也可以迭代一个对象?您可以编写一个管道来执行此操作:stackoverflow.com/questions/35534959/…
    • 两种解决方案都是非常好的调整,可以解决我的问题(虽然不是很好)。请相应地编辑您的答案,以便我验证它。我真的需要一个数组,因为我要添加、删除元素,并且我需要一个从 0 到长度 - 1 的索引。我可以用一个对象来做,但它似乎有点过分了
    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 2019-12-02
    • 2017-08-20
    • 2016-11-07
    • 2019-10-16
    • 2017-03-12
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多