2017-01-31 1 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 летуч здесь. Он выводится правильно во время перехвата жизненного цикла, но при изменении размера окна он становится нулевым. Нет camelCase problem, нет conditional dom, так что случилось с кодом?

+0

Я предполагаю, что 'resize' обжигают уже до' sidebar' установлен. Вы подписываетесь в 'ngOnInit()', но 'sidebar' будет доступен только в более позднем' ngAfterViewInit() ' –

+0

. Это, похоже, не имеет значения. Когда я подписываюсь в 'ngAfterViewInit' или даже в' ngAfterContentInit' - результат тот же. – user776686

ответ

1

Проблема связана с тем, как вы регистрируете обработчики событий.

С

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

this внутри resetSidebar не указывает на AppSidebar класса больше.

Использование .bind(this) для обеспечения this продолжает работать

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

Вы также можете использовать функции стрелок https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

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

Yup, хорошо поймать. Свобода «этого» в TS не заходит так далеко ;-) – user776686

+1

@nuton Может захотеть принять этот ответ? –

Смежные вопросы