自动滚动到底部指令在角度2中不起作用

时间:2017-06-16 05:39:45

标签: html angular

我正在创建一个聊天应用程序,我需要实现自动滚动到文本消息的底部。 div应该在页面的初始加载和重新加载时完成。我创建了一个自定义指令来实现它。然而,这似乎不起作用。

指令:

import { Directive,ElementRef,AfterViewInit} from '@angular/core';


@Directive({ selector: '[scrollToBottom]' })
export class ScrollToBottomDirective implements AfterViewInit {
    constructor(private element:ElementRef) {
        console.log('scroll', this.element);
    }
    ngAfterViewInit(){
        this.scrollToBottom();
    }
    scrollToBottom(){
        if(this.element){
            (this.element as any).nativeElement.scrollTop =(this.element as any).nativeElement.scrollHeight;
            console.log('scroll', (this.element as any).nativeElement.scrollTop) 
            console.log('scrollHeight', (this.element as any).nativeElement.scrollHeight) 
        }
    }
}

我做错了什么?

3 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

ScrollToBottom() {
    if(this.element){
       // I can't remember why I added a short timeout, 
       // the below works great though. 
       if(this.element != undefined){
          setTimeout(() => { element.scrollIntoView(true) }, 200);
       }
    }

 }

答案 1 :(得分:0)

我通过改变' AfterViewInit'的生命周期钩子来修复它。到' afterViewChecked'事件

答案 2 :(得分:0)

另外,如果您需要向下滚动一次,我建议您使用下一个解决方案:

import { Directive, ElementRef, AfterViewChecked, HostListener } from '@angular/core';

@Directive({
  selector: '[scrollToBottom]'
})
export class ScrollToBottomDirective implements AfterViewChecked {
  isActive = true;

  @HostListener('scroll') onFrameScroll() {
    this.isActive = false;
  }

  constructor(private element: ElementRef) {}

  ngAfterViewChecked() {
    this.scrollToBottom();
  }

  scrollToBottom() {
    if (this.element && this.isActive) {
      this.element.nativeElement.scrollTop = this.element.nativeElement.scrollHeight;
    }
  }
}