2017-11-20 10 views
4

에서 작동하지 않는 나는아동 모델 getter 및 setter가 각 2/4

export class Parent 
{ 
    name: string; 
    containers: Container[]; 
} 

export class Container 
{ 
    desc: string; 
    sets: Sets[]; 
} 


export class Sets 
{ 
    private _data?: any[]; 
    private _dataSet?: any[]; 

    get data() 
    { 
     if (this.dataSet && this.dataSet.length > 0) 
     { 
      return this._dataSet[0].data; 
     } 
     return this._data; 
    } 

    set data(data: any[]) 
    { 
     this._data = data; 
    } 

    get dataSet() 
    { 
     return this._dataSet; 
    } 

    set dataSet(dataSet: any[]) 
    { 
     this._dataSet = dataSet; 
    } 
} 

다음과 같이 세 가지 모델 클래스를 정의 상황이 문제는 다음 gettersetter 방법 Set의 클래스 같으면를 ' 내가 new Set()을 명시 적으로 수행하지 않으면 트리거되지 않습니다 (new Set()이 정말로 필요한지는 알 수 없습니다). 예를 들어

:

"name": "vik", 
"containers": [ 
{ 
    "desc": "something", 
    "sets": [ 
    { 
     "dataSet": [ 
     { 
      "data":[ 
      { 
       // Object 
      }] 
     }] 
    }] 
}] 

내가 할 경우 :

let response:Parent = responseObj; 
console.log(response.containers[0].sets[0].data) 

는 데이터 집합 value를 반환해야하지만 대신이 undefined를 반환합니다.

하지만 난 할 경우 :

let response:Parent = responseObj; 
console.log(new Sets(response.containers[0].sets[0]).data) 

나에게 올바른 값을 반환합니다.

뭔가 빠졌거나 작동하도록 코드를 향상시킬 수 있습니까?

+0

하지 않음 매우 생각한다 nested object of class transformer

import { Type, plainToClass } from 'class-transformer'; export class Parent { @Type(() => Container) name: string; containers: Container[] = []; static fromJson(json: any): Parent { return plainToClass<any, Parent>(Parent, json); } } export class Container{ @Type(() => Set) desc: string; sets: Set[] = []; } export class Set{ private _data?: any[]; private _dataSet?: any[]; //your code } 

다음

let response:Parent = responseObj; console.log(Parent.fromJson(response).containers[0].sets[0].data) 

:

그래서 난 그냥 리팩토링 한 방법을 제안 여러 중첩을 위해 할 수있는 일은 많습니다. [이 답변] (https://stackoverflow.com/a/43977474/1838048)을 참조하십시오. – Oliver

+0

http 응답과 같이 외부에서 개체가 왔습니까? – Vitalii

+0

예, http 응답 –

답변

1

문제는 HTTP에서 오는 것입니다. 이것은 무엇을 의미합니까?

HTTP는 텍스트 기반 형식입니다. 당신이 JSON.parse (데이터)처럼 매끄러운와 같은 실제 개체를 반환 않는 그런

"{"foo":"boor"}" 

:

{foo: "bar"}; 

그러나 JSON.parse이 응답이 올 때 같은 단지 문자열을 의미 유형에 대해 아무 것도하지 않습니다. 그것은 개체의 문자열 인스턴스를 만드는 방법을 알지 못합니다. 그것은 단순한 객체를 만들려고 시도 할 수 있습니다.

데이터 객체에는 유형, 메소드, getter/setters e.t.c에 대한 정보가 없습니다. 일명 비행기 데이터 일뿐입니다. 그래서, 당신이 당신의 dto에서 실제 클래스를 얻으려면 더 똑똑한 파서를 작성해야합니다. 그것은 당신의 dto를 가져 와서 기대되는 클래스의 실제 인스턴스를 생성합니다. 은 기본적으로 당신은 이미 당신이이 일을 계속 할 수

new Sets(response.containers[0].sets[0]) 

하여이 작업을 수행 할 수 있지만이 반복적 인 코드는 모든 응용 프로그램 주위 것을 발견 할 것이다보다. 가장 좋은 방법은 데이터 서버에 mapper를 삽입하고 dto가 아니라 인스턴스를 반환하는 것입니다. 그래서 당신의 다른 코드는이 "더러운"작업에 아무런 도움이되지 않으며 항상 "정상적인"객체와 함께 작동합니다.

희망이 도움이됩니다.

UPD :

let rawData = '{"name":"Vitalii"}'; 
 
let person1 = JSON.parse(rawData); 
 

 
function Person(data) { 
 
    this.name = data.name; 
 
    this.say = function() { 
 
    console.log(`Hi, ${this.name}`); 
 
    } 
 
} 
 

 
let person2 = new Person(person1); 
 
person2.say(); 
 

 
// person1 and person2 have the same data inside. But: 
 

 
console.log(person2 instanceof Person); // true 
 
console.log(person1 instanceof Person); // false

이 객체가 비슷하더라도 다른 성격을 가지고 있기 때문입니다.

+0

새 부모 (응답) 할 때 작동하지 않아야합니까? –

+0

생성자에 넣을 논리에 따라 다릅니다. 응답에서 데이터 만 가져올 수 있습니다. all. 그런 다음 트리에있는 메서드가있는 객체마다 새 객체를 만들어야합니다. (죄송합니다. 사용자 나 나 대신이 작업을 수행 할 수있는 것을 찾지 못했습니다.) – Vitalii

+0

JSON.parse 또는 기타 다른 것들에서 가져온 클래스와 원시 데이터 사이의 크고 깊은 전체 – Vitalii

1

예, 정의 된 클래스 인스턴스에 평범한 개체를 구문 분석해야하며 다른 개체는 이미 응답 해 놓은 상태 여야합니다. 이 정도의 깔끔한, 나는

희망이 도움이 ~