【问题标题】:Getting Error while adding eventlistener to whole document将事件监听器添加到整个文档时出错
【发布时间】:2019-08-19 22:23:08
【问题描述】:

我有一个函数可以在滚动条移动时执行一些操作。我已经使用 id 将事件监听器添加到该文档中,但它给出了错误

ERROR TypeError: Cannot read property 'nativeElement' of undefined

  ngOnInit() {
    document.getElementById('sidenav').addEventListener('scroll',()=> this.onScroll('$event'),true);  
    // window.addEventListener('scroll',this.onScroll,true);

  }

  ngOnChanges(changes: SimpleChanges) {
    this.data = changes.data.currentValue;
    this.data_display = changes.data.currentValue.slice(0, 6);
  }

  ngOnDestroy() {
    console.log('destroy')
    document.getElementById('sidenav').removeEventListener('scroll',()=> this.onScroll('$event'),false);
    // window.removeEventListener('scroll',this.onScroll,false)
  }

  // @HostListener('document:scroll', ['$event'])
  onScroll(event): void {
    const top = event.elementRef.nativeElement.scrollTop;
    const total = event.elementRef.nativeElement.scrollHeight;
    const height = event.elementRef.nativeElement.clientHeight;
    if ((height + top) === total) {
      if (this.data_display.length <= this.data.length) {
        this.data_display.push(...this.data.slice(this.start, this.end));
        this.start += 6;
        this.end += 6;
      }
      console.log('yes')
      this.cdr.detectChanges();
    }
  }

【问题讨论】:

  • 我怀疑您在函数this.onScroll 中缺少this 上下文。也许您需要做的就是将其更改为document.getElementById('sidenav').addEventListener('scroll', () =&gt; this.onScroll(),true);

标签: angular typescript


【解决方案1】:

在 Angular 中,您不能使用 addEventListener 方法直接添加事件监听器。您可以使用@HostListener(这是最首选的方式)添加它,如下所示:

@HostListener('window:scroll', ['$event'])
scrollEvent(event) { 
    // Statements
 }

您可以按照以下方式执行另一种方法,但当组件被销毁时不会删除此回调:

window.addEventListener("scroll", this.onScroll, true);

【讨论】:

  • 如何使用 ngondestroy() 删除此事件?
  • @HostListener 组件被销毁时会自动移除事件,因此您不必手动销毁它,详情请参考:stackoverflow.com/questions/41031961/…
  • 我在 @HostListener('window:scroll', ['$event']) scrollEvent(event) { console.log('1') 的代码中添加了 console.log() 行} 当我移动到另一个页面并滚动时,这不应该打印 1
  • 如果你想全局添加滚动然后把它放在AppComponent 这是所有组件的父级
  • 我仍然被这个问题困扰
猜你喜欢
  • 2013-01-12
  • 2021-08-31
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
相关资源
最近更新 更多