2017-08-10 13 views
1

私は人のFormArrayを含むフォームを持っています。人々配列は、その後、私に次のようなJSONを与えるアドレスのFormArrayが含まれています角2 - FormArrayからオブジェクトの配列を作成します。

{ 
    "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" 
     } 
     ] 
    } 
    ] 
} 

は、今私は、フォームからこれらの「人」を取ると人の配列を作成しようとしている

export class ReportPerson {  
    lastName: string = ''; 
    firstName: string = ''; 
    middleName: string = ''; 
    addresses: PersonAddress[]; 
} 
export class PersonAddress { 
     street: string = ''; 
} 
オブジェクト

私はconsole.log(form.get( 'people')。value)を使用します。私は次の結果を得ます:

(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"を読み取ることができないという結果が返されます。

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に慣れています。この問題横切る他の誰のために

+0

コンソールで値を取得できたら、form.get( 'people')。valueを使用してvar people = form.get( 'people')。valueで同じ値を使用できる場合は、 – Sreemat

+0

これは誤字ですか? – Sreemat

+0

私に見えるタイプミスはありません。 Intellisenseには何も表示されません。そして私はエラーなく配列から追加/削除できます。 私は値と「人」の長さを取得することができますが、すぐに私は、配列を反復処理し、プロパティにアクセスしようとして、私は未定義のエラーを取得します。 –

答えて

1

、私は「人の形配列の値から新しいフォームの配列を作成することによって、それを解決することができました。その後、フォーム配列関数を使用してフォーム値をオブジェクト値にマップします。次に、私はアドレスの配列のプロセスを繰り返しました。

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); 

} 
1

これはうまくいきました。

思想私は、このかかわらずをやっただろうか投稿します。

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; 
    } 
} 
+0

それはずっともっときれいに見えます。私はそれを撃つだろう。ありがとう! –

関連する問題