2016-09-16 3 views
0

저는 TypeScript 및 Angular2로 몸살을 앓고 있습니다. 중첩 된 개체 구조가있는 API로 작업하고 있습니다. 내 모델에서 API의 리소스를 미러링하고 싶습니다. 이다Angular2 FormBuilder 및 중첩 된 객체 속성이 반환되지 않음

import { Component, OnInit } from '@angular/core'; 
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; 
import { InquireService } from './inquire.service'; 
import { Inquiry } from './inquiry'; 

@Component({ 
    selector: 'inquire-form', 
    templateUrl: './inquire-form.component.html' 
}) 
export class InquireFormComponent implements OnInit { 
    inquiryForm: FormGroup; 
    inquiry = new Inquiry; 

    constructor(
    private formBuilder: FormBuilder, 
    private inquireService: InquireService) {} 

    ngOnInit(): void { 
    this.buildForm(); 
    } 

    buildForm(): void { 
    this.inquiryForm = this.formBuilder.group({ 
     'firstName': [ 
     this.inquiry.name.first, [ 
      Validators.required, 
      Validators.minLength(2), 
      Validators.maxLength(50) 
     ] 
     ], ... 
    } 
} 

나는 내 길을 쳤을 때 내가 오류 :

Error: Uncaught (in promise): TypeError: Cannot read property 'first' of undefined 
타이프에 정의 된 모델/자원, "귀하": 같은

// inquiry.ts 
export class Inquiry { 
    name: { 
    first: string, 
    last: string 
    }; 
    email: string; 
    phone: string; 
    question: string; 
} 

내 폼 구성 요소입니다

this.inquiry.name을 기록하면 실제로는 undefined이지만 그 이유는 알 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

'name'속성의 유형 서명이 무엇인지 명시했지만 실제로는 초기화하지 않았습니다. 그것을 zed. –

+0

흠. 새 Inquiry 인스턴스 (생성자 위)를 만들 때 초기화되지 않습니까? – Brandon

+0

"Inquiry"객체에는 '{first : string, last : string}'및'email','phone' 및'question' 유형의'name '속성이 4 개 포함되어 있다고 선언했습니다. '문자열'타입의. 어떤 속성도 명시 적으로 초기화되지 않으므로 기본값 ('undefined') 만 있습니다. –

답변

2

문제는 인 모든 Inquiry 개체의 속성이 초기화되지 않기 때문입니다. 중요한 사항 인 name이 초기화되지 않았으므로 해당 속성 (first 또는 last)에 액세스하려는 시도가 실패합니다.

어느 생성자에서 설정 :

constructor() { 
    this.name = {} as any; // too lazy to give first/last properties 
} 

또는 선언에 초기화 :

class Inquiry { 
    name = {} as { 
     first: string, 
     last: string 
    }; 
    email: string; 
    phone: string; 
    question: string; 
} 

또는 명시 적으로 선언 형식을 유지하고 형식 유추에 의존하지하려면 :

class Inquiry { 
    name: { 
     first: string, 
     last: string 
    } = {} as any; 
    email: string; 
    phone: string; 
    question: string; 
} 
+0

아. 두 번째 예가 더 의미가 있습니다. 내 컴퓨터로 돌아 가면 바로 시도해 보겠습니다. 도움을 주셔서 대단히 감사합니다. – Brandon

+0

두 번째 예제를 구현했고 formBuilder가 다시 작동합니다. 고맙습니다! 분명히 나는 ​​TypeScript를 다듬어야한다. – Brandon

+0

필자는 이것이 반드시 필기체 일 뿐이라고 말하지 않겠다. 일반적인 OOP 일 뿐이다. 차이점은 객체의 패턴을 설명하고 명시 적 이름을 지정하지 않는 것입니다. 특정 속성을 가진 객체에 변수/속성을 선언했습니다. 하지만 Java 또는 C# 에서처럼 변수를 일부 값으로 초기화해야합니다. –