2017-01-09 1 views
0

내가 많이 사용하는 오류가 있습니다. TypeError : '정의되지 않은'속성 '을 읽을 수 없습니다. 그리고 내 코드 작동
하지만 왜 * ngIf 또는 비동기 사용해야합니까? 왜 그런가?
그리고 난 내가 강하게 당신이 좋은 답변을보고하시기 바랍니다TypeError : undefined의 'something'속성을 읽을 수 없습니다. 각도 2

// service 
    public getEmployee(id) { 
    return this._af.database.object(`/employee/${id}`) 
    .map(response => response) 
    .catch(error => Observable.throw(error.json())); 
    } 



//component 
    public employee: Employee; 

    ngOnInit() { 
    this.route.params 
     .switchMap((params: Params) => this._EmployeesService.getEmployee(params['employeeId'])) 
     .subscribe(employee => { 
     this.employee = employee; 
     }); 
    } 


//html 
<div *ngIf="employee">...</div>` // ok 
<div>{{employee?.name}}</div> // also ok 

<div>{{employee.name}}</div> // error here, TypeError: Cannot read property 'name' of undefined. 
+0

은 게시 된 코드에서 '무엇인가'입니까? –

+0

{{employee.name}} 예를 들어 이름이 존재하기 때문에 –

+0

은 쉽게 해결할 수 있습니다. 사용하기 전에 객체를 초기화하십시오! – Fals

답변

1

하지만 난 답을 찾을 수없는 울부 짖는 소리
죄송합니다 무엇을 설명이 이상한 솔루션없이이 문제를 해결할 수 : How do I return the response from an asynchronous call?

하지만를 들어 짧은 소개 :

자바 스크립트의 특성은 비동기입니다. 일부 기능을 완료하는 데 시간이 걸립니다. 예를 들어, 데이터베이스를 조회하고 결과를 얻기 위해 firebase를 요청하십시오. 대부분 네트워크 속도에 따라 다소 시간이 걸릴 것입니다. 다른 도메인에서 무언가를 요청한다고 가정하면 시간이 좀 걸릴 것입니다. 염두에두고

, 귀하의 예를 살펴

당신은 employee 객체

<div>{{employee.name}}</div> 

에 따라 구속력있는 HTML을 가지고 있고 당신은 시간이 좀 걸릴 것입니다 (비동기이 employee 객체를 요청 에서)이 객체를 얻을 수 있도록 ngOnInit

ngOnInit() { 
    this.route.params 
     .switchMap((params: Params) => this._EmployeesService.getEmployee(params['employeeId'])) 
     .subscribe(employee => { 
     this.employee = employee; //<--- here 
     }); 
    } 

당신이,232,349을 결합하기 전에~ this.employee, this.employee이 비어 있습니다 (undefined). 그렇기 때문에 null/undefined*ngIf으로 확인하거나 안전한 탐색 연산자 (?)

+0

오케이, 나도 동의한다. 그래서 '?'를 사용하는 것이 좋다. 연산자 또는 * ngIf이거나 모범 사례처럼 더 나은 방법으로 존재할 수도 있습니다. –

+0

@LimarenkoDenis 상황에 따라 사용 사례가 다릅니다. 이 경우에는 거의 똑같습니다. – echonax

관련 문제