在调整大小事件期间,ViewChild未定义

时间:2017-01-31 09:44:25

标签: angular events 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,那么代码有什么问题?

1 个答案:

答案 0 :(得分: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);