angular2-data-table
Version:
angular2-data-table is a Angular2 component for presenting large and complex data.
64 lines (51 loc) • 1.38 kB
text/typescript
import {
Directive, Output, EventEmitter, ElementRef, HostBinding, NgZone, OnInit, OnDestroy
} from '@angular/core';
/**
* Visibility Observer Directive
*
* Usage:
*
* <div
* visibility-observer
* (visible)="onVisible($event)">
* </div>
*
*/
({ selector: '[visibility-observer]' })
export class VisibilityDirective implements OnInit, OnDestroy {
('class.visible')
isVisible: boolean = false;
() visible: EventEmitter<any> = new EventEmitter();
timeout: any;
constructor(private element: ElementRef, private zone: NgZone) { }
ngOnInit(): void {
this.runCheck();
}
ngOnDestroy(): void {
clearTimeout(this.timeout);
}
onVisibilityChange(): void {
// trigger zone recalc for columns
this.zone.run(() => {
this.isVisible = true;
this.visible.emit(true);
});
}
runCheck(): void {
const check = () => {
// https://davidwalsh.name/offsetheight-visibility
const { offsetHeight, offsetWidth } = this.element.nativeElement;
if (offsetHeight && offsetWidth) {
clearTimeout(this.timeout);
this.onVisibilityChange();
} else {
clearTimeout(this.timeout);
this.zone.runOutsideAngular(() => {
this.timeout = setTimeout(() => check(), 50);
});
}
};
setTimeout(() => check());
}
}