2017-01-31 4 views
1

가 보자 크기 조정 이벤트 기간 동안 정의되지 않습니다ViewChild는

import { 
    Component, OnInit, ViewEncapsulation, Input, ElementRef, ViewChild, AfterViewInit 
} from '@angular/core'; 

@Component({ 
    selector: 'app-sidebar', 
    template: ` 
    <aside #sidebar> 
    Sidebar 
    </aside>`, 
}) 
export class AppSidebar implements OnInit, AfterViewInit { 
    @ViewChild('sidebar') 
    private sidebar: ElementRef; 

    constructor() { 
    } 

    ngOnInit() { 
    console.log('OnInit has:', this.sidebar) 
    window.addEventListener('resize', this.resetSidebar); 
    } 

    ngAfterViewInit() { 
    console.log('AfterViewInit has:', this.sidebar); 
    } 

    resetSidebar() { 
    console.log(this.sidebar); 
    } 
} 

this.sidebar 여기 휘발성이다. 라이프 사이클 후크 중에 올바르게 로그 아웃하지만, 창 크기를 조정하면 null이됩니다. 아니 camelCase problem, 아니 conditional dom, 그래서 코드가 잘못 됐어?

+0

내가 resize'은 sidebar'이 설정되어'전에 이미 해고'추측을 사용할 수 있습니다

window.addEventListener('resize', this.resetSidebar.bind(this); 

작업 유지합니다. 'ngOnInit()'에 가입했는데'sidebar'는 나중에 'ngAfterViewInit()'에서만 사용할 수 있습니다. –

+0

그것은 중요하지 않습니다. 'ngAfterViewInit' 또는'ngAfterContentInit'에서 구독 할 때 - 결과는 같습니다. – user776686

답변

1

이 문제는 이벤트 처리기를 등록하는 방법으로 인해 발생합니다. resetSidebar 내부

window.addEventListener('resize', this.resetSidebar); 

this

더 이상 AppSidebar 클래스를 가리 키지 않습니다. this을 보장하기 위해

사용 .bind(this)

당신은 또한 화살표 기능 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

window.addEventListener('resize', (event) => this.resetSidebar(event); 
+1

그래, 잘 잡으세요. TS에서 '이'의 자유가 그리 멀지는 않습니다 .-) – user776686

+1

@ nuton 그러면이 대답을 받아 들일 수 있습니까? –