如何获得"这个"在Angular2中窗口中的滚动事件监听器中的关键字?

时间:2016-05-04 05:52:04

标签: angular

我在我的组件类中有一个函数,我附加了滚动事件监听器。我这样做:

private _scrollListener(event){
    console.log("inside the scroll listener; this: ",this);
    this._zone.run(() => {
        this.checkForLazyLoad = !this.checkForLazyLoad;
    })
}

ngOnInit() {
    window.addEventListener("scroll", this._scrollListener);
}

问题在于"这个"私有函数中的关键字" _scrollListener"指向窗口对象。我怎样才能获得班级的价值?实例里面的滚动事件监听器?

3 个答案:

答案 0 :(得分:2)

ngOnInit() {
    window.addEventListener("scroll", this._scrollListener.bind(this);
}

或者可能是更好的解决方案

@HostListener('window:scroll', ['$event'])
private _scrollListener(event){
    console.log("inside the scroll listener; this: ",this);
    this._zone.run(() => {
        this.checkForLazyLoad = !this.checkForLazyLoad;
    })
}
通过这种方式,您无法取消注册该事件,但在删除该组件时它会自动取消注册。

答案 1 :(得分:0)

我会使用以下内容:

private _scrollListener(event){
  console.log("inside the scroll listener; this: ",this);
  this._zone.run(() => {
    this.checkForLazyLoad = !this.checkForLazyLoad;
  })
}

ngOnInit() {
  window.addEventListener("scroll", (event) => {
    this._scrollListener(event);
  });
}

这是因为你引用了这个函数,所以你失去了它的执行上下文(即组件本身)。这样您就可以保留this关键字。

使用TypeScript小心bind方法:

答案 2 :(得分:0)

我通过简单地使用箭头函数解决了这个问题:

private _scrollListener(event){
    console.log("inside the scroll listener; this: ",this);
    this._zone.run(() => {
        this.checkForLazyLoad = !this.checkForLazyLoad;
    })
}

ngOnInit() {
    window.addEventListener("scroll", (event) => {
        this._scrollListener(event);
    });
}