1

所以我试图根据我的 Angular 应用程序的滚动来做一些事件。

我有一个问题,因为我试图在 .html 的帮助下访问我的 HTML 中的元素@ViewChild

我可以访问里面的元素,ngAfterViewInit()但我不能在外面访问它。它总是显示未定义。

这是我的组件类:

export class NavBarComponent implements OnInit {

  @ViewChild('navBar')
  navBar:ElementRef;

  constructor(private renderer: Renderer2) {
  }

  ngAfterViewInit(){
    window.addEventListener('scroll', this.onScroll, true);
    console.log(this.navBar.nativeElement);
  }

  ngOnInit(): void {

  }

  onScroll(){
    console.log("I am scrolling right now.")
    console.log(this.navBar.nativeElement)
  }

  onResize(){

  }

  onTabClick(){

  }
}

当我在里面进行控制台登录时,ngAfterViewInit()我得到了 HTML 元素,但是当我在里面进行控制台登录时,onScroll()它是未定义的。

为什么我的元素在 viewinit 后消失并且未定义?我没有使用任何ngIf删除元素的东西。

这是组件的 HTML 代码。

  <section class="et-hero-tabs" >
    <h1>STICKY SLIDER NAV</h1>
    <h3>Sliding content with sticky tab nav</h3>
    <div class="et-hero-tabs-container" #navBar>
      <a class="et-hero-tab" href="">ES6</a>
      <a class="et-hero-tab" href="">Flexbox</a>
      <a class="et-hero-tab" href="">React</a>
      <a class="et-hero-tab" href="">Angular</a>
      <a class="et-hero-tab" href="">Other</a>
      <span class="et-hero-tab-slider"></span>
    </div>
  </section>

这是控制台错误: 在此处输入图像描述

4

1 回答 1

1

您可以使用方法this在回调函数中绑定关键字的含义。bind()尝试以下

ngAfterViewInit(){
  window.addEventListener('scroll', this.onScroll.bind(this), true);
  console.log(this.navBar.nativeElement);
}

如果没有绑定,回调中的this关键字范围onScroll()不会指向类的范围。

于 2020-05-28T16:34:35.117 回答