首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度2-从FormArray创建对象数组

角度2-从FormArray创建对象数组
EN

Stack Overflow用户
提问于 2017-08-10 13:32:34
回答 2查看 11.6K关注 0票数 3

我有一个表单,其中包含一个人员的FormArray。然后,people数组包含一个地址的FormArray,它给我提供了以下JSON:

代码语言:javascript
复制
{
  "people": [
    {
      "lastName": "Last-1",
      "firstName": "First-1",
      "middleName": "",
      "addresses": [
        {
          "street": "Person1 - Address1"
        },
        {
          "street": "Person1 - Address2"
        }
      ]
    },
    {
      "lastName": "Last-2",
      "firstName": "Last-2",
      "middleName": "",
      "addresses": [
        {
          "street": "Person2 - Address1"
        }
      ]
    }
  ]
}

现在,我尝试从表单中获取这些"people“,并创建Person对象的数组

代码语言:javascript
复制
export class ReportPerson {    
    lastName: string = '';
    firstName: string = '';
    middleName: string = ''; 
    addresses: PersonAddress[];
}
export class PersonAddress {
        street: string = '';   
}

当我使用console.log(form.get(‘people’).value)时,我得到以下结果:

代码语言:javascript
复制
(2) [{…}, {…}]0: {lastName: "Last-1", firstName: "First-1", middleName: "", 
addresses: Array(2)}
              1: {lastName: "Last-2", firstName: "Last-2", middleName: "", 
addresses: Array(1)}length: 2__proto__: Array(0)

但无论我如何尝试获取数据,它都显示我的列表是未定义的。例如,下面的代码返回它不能读取未定义的"lastName“。

代码语言:javascript
复制
 save(form: any) {
        var reportPersonList: ReportPerson[] = new Array();
        var people = form.get('people');

        for (let i = 0; i < people.length; i++) {
            console.log(people[i].lastName);
       }
    }
} 

我的问题是,从FormArray中的数据创建人物对象数组的正确语法是什么?我知道我遗漏了一些基本的东西,但我已经习惯了C#和新的Typescript/Angular2。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-14 10:12:21

对于遇到这个问题的任何其他人,我能够通过从'people‘表单数组的值创建一个新的表单数组来解决这个问题。然后使用表单数组函数将表单值映射到对象值。然后,我对地址数组重复了这个过程。

代码语言:javascript
复制
save(form: any) {
    var reportPersonList: ReportPerson[] = new Array();

    var people = form.get('people') as FormArray;

    for (let i = 0; i < people.length; i++) {
        var p = new ReportPerson;
        p.lastName = people.at(i).get('lastName').value;
        p.firstName = people.at(i).get('firstName').value;
        p.middleName = people.at(i).get('middleName').value;
        var addresses = people.at(i).get('addresses') as FormArray;
        for (let j = 0; j < addresses.length; j++) {
            var a = new PersonAddress;
            a.street = addresses.at(j).get('street').value;

            p.addresses.push(a);
        };
        reportPersonList.push(p);
    }
    this.reportFormDataService.setReportPeople(reportPersonList);

}
票数 2
EN

Stack Overflow用户

发布于 2017-08-14 10:26:49

很高兴你让它工作了!

我想我会把我该怎么做的贴出来。

代码语言:javascript
复制
let json = {
  "people": [
    {
      "lastName": "Last-1",
      "firstName": "First-1",
      "middleName": "",
      "addresses": [
        {
          "street": "Person1 - Address1"
        },
        {
          "street": "Person1 - Address2"
        }
      ]
    },
    {
      "lastName": "Last-2",
      "firstName": "Last-2",
      "middleName": "",
      "addresses": [
        {
          "street": "Person2 - Address1"
        }
      ]
    }
  ]
}

// for each person in the array, return a class instantiate
json.people.map(person => {
  return new Person().deserialize(person);
});

// 
class Person(){

  public lastName: string;
  public middleName: string;
  public firstName: string;
  public addresses: Array<any>

  constructor(){
    this.addresses = new Array<string>();
  }

  // note you could of just used the constructor,
  // but its a personal preference to have a serialize and deserialize for data coming from the server in a json object type.
  deserialize(data: any){
    this.lastName = data.lastName;
    this.firstName = data.firstName;
    this.middleName = data.middleName;
    this.addresses = data.addresses;
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45605179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档