ng-ytl-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
113 lines (93 loc) • 2.84 kB
text/typescript
import {
Component,
ContentChild,
EventEmitter,
Input,
OnDestroy,
OnInit,
Output,
Renderer2,
TemplateRef,
ViewEncapsulation,
} from '@angular/core';
import {
animate,
style,
transition,
trigger,
} from '@angular/animations';
import { Subscription } from 'rxjs/Subscription';
import { fromEvent } from 'rxjs/observable/fromEvent';
import { distinctUntilChanged } from 'rxjs/operators/distinctUntilChanged';
import { throttleTime } from 'rxjs/operators/throttleTime';
import { NzScrollService } from '../core/scroll/nz-scroll.service';
export class NzBackTopComponent implements OnInit, OnDestroy {
private scroll$: Subscription = null;
private target: HTMLElement = null;
_display: boolean = false;
nzTemplate: TemplateRef<void>;
nzVisibilityHeight: number = 400;
set nzTarget(el: HTMLElement) {
this.target = el;
this.registerScrollEvent();
}
nzClick: EventEmitter<boolean> = new EventEmitter();
constructor(private scrollSrv: NzScrollService, private _renderer: Renderer2) {
}
ngOnInit(): void {
if (!this.scroll$) this.registerScrollEvent();
}
clickBackTop(): void {
this.scrollSrv.scrollTo(this.getTarget(), 0);
this.nzClick.emit(true);
}
private getTarget(): HTMLElement | Window {
return this.target || window;
}
private handleScroll(): void {
this._display = this.scrollSrv.getScroll(this.getTarget()) > this.nzVisibilityHeight;
}
private removeListen(): void {
if (this.scroll$) this.scroll$.unsubscribe();
}
private registerScrollEvent(): void {
this.removeListen();
this.handleScroll();
this.scroll$ = fromEvent(this.getTarget(), 'scroll').pipe(throttleTime(50), distinctUntilChanged())
.subscribe(e => {
this.handleScroll();
});
}
ngOnDestroy(): void {
this.removeListen();
}
}