UNPKG

ngx-infinite-scroll

Version:

[![Build Status](https://travis-ci.org/orizens/ngx-infinite-scroll.svg?branch=master)](https://travis-ci.org/orizens/ngx-infinite-scroll) [![Backers on Open Collective](https://opencollective.com/ngx-infinite-scroll/backers/badge.svg)](#backers) [![Sponso

113 lines 14.2 kB
import { Directive, EventEmitter, Input, Output, } from '@angular/core'; import { hasWindowDefined, inputPropChanged } from './services/ngx-ins-utils'; import { createScroller, InfiniteScrollActions, } from './services/scroll-register'; import * as i0 from "@angular/core"; export class InfiniteScrollDirective { constructor(element, zone) { this.element = element; this.zone = zone; this.scrolled = new EventEmitter(); this.scrolledUp = new EventEmitter(); this.infiniteScrollDistance = 2; this.infiniteScrollUpDistance = 1.5; this.infiniteScrollThrottle = 150; this.infiniteScrollDisabled = false; this.infiniteScrollContainer = null; this.scrollWindow = true; this.immediateCheck = false; this.horizontal = false; this.alwaysCallback = false; this.fromRoot = false; } ngAfterViewInit() { if (!this.infiniteScrollDisabled) { this.setup(); } } ngOnChanges({ infiniteScrollContainer, infiniteScrollDisabled, infiniteScrollDistance, }) { const containerChanged = inputPropChanged(infiniteScrollContainer); const disabledChanged = inputPropChanged(infiniteScrollDisabled); const distanceChanged = inputPropChanged(infiniteScrollDistance); const shouldSetup = (!disabledChanged && !this.infiniteScrollDisabled) || (disabledChanged && !infiniteScrollDisabled.currentValue) || distanceChanged; if (containerChanged || disabledChanged || distanceChanged) { this.destroyScroller(); if (shouldSetup) { this.setup(); } } } ngOnDestroy() { this.destroyScroller(); } setup() { if (!hasWindowDefined()) { return; } this.zone.runOutsideAngular(() => { this.disposeScroller = createScroller({ fromRoot: this.fromRoot, alwaysCallback: this.alwaysCallback, disable: this.infiniteScrollDisabled, downDistance: this.infiniteScrollDistance, element: this.element, horizontal: this.horizontal, scrollContainer: this.infiniteScrollContainer, scrollWindow: this.scrollWindow, throttle: this.infiniteScrollThrottle, upDistance: this.infiniteScrollUpDistance, }).subscribe((payload) => this.handleOnScroll(payload)); }); } handleOnScroll({ type, payload }) { const emitter = type === InfiniteScrollActions.DOWN ? this.scrolled : this.scrolledUp; if (hasObservers(emitter)) { this.zone.run(() => emitter.emit(payload)); } } destroyScroller() { if (this.disposeScroller) { this.disposeScroller.unsubscribe(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: InfiniteScrollDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.2", type: InfiniteScrollDirective, isStandalone: true, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: { infiniteScrollDistance: "infiniteScrollDistance", infiniteScrollUpDistance: "infiniteScrollUpDistance", infiniteScrollThrottle: "infiniteScrollThrottle", infiniteScrollDisabled: "infiniteScrollDisabled", infiniteScrollContainer: "infiniteScrollContainer", scrollWindow: "scrollWindow", immediateCheck: "immediateCheck", horizontal: "horizontal", alwaysCallback: "alwaysCallback", fromRoot: "fromRoot" }, outputs: { scrolled: "scrolled", scrolledUp: "scrolledUp" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: InfiniteScrollDirective, decorators: [{ type: Directive, args: [{ selector: '[infiniteScroll], [infinite-scroll], [data-infinite-scroll]', standalone: true }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { scrolled: [{ type: Output }], scrolledUp: [{ type: Output }], infiniteScrollDistance: [{ type: Input }], infiniteScrollUpDistance: [{ type: Input }], infiniteScrollThrottle: [{ type: Input }], infiniteScrollDisabled: [{ type: Input }], infiniteScrollContainer: [{ type: Input }], scrollWindow: [{ type: Input }], immediateCheck: [{ type: Input }], horizontal: [{ type: Input }], alwaysCallback: [{ type: Input }], fromRoot: [{ type: Input }] } }); function hasObservers(emitter) { // Note: The `observed` property is available only in RxJS@7.2.0, which means it's // not available for users running the lower version. return emitter.observed ?? emitter.observers.length > 0; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW5maW5pdGUtc2Nyb2xsL3NyYy9saWIvbmd4LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHFCQUFxQixHQUN0QixNQUFNLDRCQUE0QixDQUFDOztBQU1wQyxNQUFNLE9BQU8sdUJBQXVCO0lBbUJsQyxZQUFvQixPQUFtQixFQUFVLElBQVk7UUFBekMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUFoQm5ELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUNwRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFFdkQsMkJBQXNCLEdBQVcsQ0FBQyxDQUFDO1FBQ25DLDZCQUF3QixHQUFXLEdBQUcsQ0FBQztRQUN2QywyQkFBc0IsR0FBVyxHQUFHLENBQUM7UUFDckMsMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLDRCQUF1QixHQUFRLElBQUksQ0FBQztRQUNwQyxpQkFBWSxHQUFZLElBQUksQ0FBQztRQUM3QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGFBQVEsR0FBWSxLQUFLLENBQUM7SUFJNkIsQ0FBQztJQUVqRSxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUNoQyxJQUFJLENBQUMs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c0I7c0JBQTlCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSzs7QUF3RVIsU0FBUyxZQUFZLENBQUksT0FBd0I7SUFDL0Msa0ZBQWtGO0lBQ2xGLHFEQUFxRDtJQUNyRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElJbmZpbml0ZVNjcm9sbEV2ZW50LCBJSW5maW5pdGVTY3JvbGxBY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgaGFzV2luZG93RGVmaW5lZCwgaW5wdXRQcm9wQ2hhbmdlZCB9IGZyb20gJy4vc2VydmljZXMvbmd4LWlucy11dGlscyc7XG5pbXBvcnQge1xuICBjcmVhdGVTY3JvbGxlcixcbiAgSW5maW5pdGVTY3JvbGxBY3Rpb25zLFxufSBmcm9tICcuL3NlcnZpY2VzL3Njcm9sbC1yZWdpc3Rlcic7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tpbmZpbml0ZVNjcm9sbF0sIFtpbmZpbml0ZS1zY3JvbGxdLCBbZGF0YS1pbmZpbml0ZS1zY3JvbGxdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XG57XG4gIEBPdXRwdXQoKSBzY3JvbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUluZmluaXRlU2Nyb2xsRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBzY3JvbGxlZFVwID0gbmV3IEV2ZW50RW1pdHRlcjxJSW5maW5pdGVTY3JvbGxFdmVudD4oKTtcblxuICBASW5wdXQoKSBpbmZpbml0ZVNjcm9sbERpc3RhbmNlOiBudW1iZXIgPSAyO1xuICBASW5wdXQoKSBpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2U6IG51bWJlciA9IDEuNTtcbiAgQElucHV0KCkgaW5maW5pdGVTY3JvbGxUaHJvdHRsZTogbnVtYmVyID0gMTUwO1xuICBASW5wdXQoKSBpbmZpbml0ZVNjcm9sbERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGluZmluaXRlU2Nyb2xsQ29udGFpbmVyOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBzY3JvbGxXaW5kb3c6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpbW1lZGlhdGVDaGVjazogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBob3Jpem9udGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsd2F5c0NhbGxiYWNrOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZyb21Sb290OiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkaXNwb3NlU2Nyb2xsZXI/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKCF0aGlzLmluZmluaXRlU2Nyb2xsRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0dXAoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyh7XG4gICAgaW5maW5pdGVTY3JvbGxDb250YWluZXIsXG4gICAgaW5maW5pdGVTY3JvbGxEaXNhYmxlZCxcbiAgICBpbmZpbml0ZVNjcm9sbERpc3RhbmNlLFxuICB9OiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgY29udGFpbmVyQ2hhbmdlZCA9IGlucHV0UHJvcENoYW5nZWQoaW5maW5pdGVTY3JvbGxDb250YWluZXIpO1xuICAgIGNvbnN0IGRpc2FibGVkQ2hhbmdlZCA9IGlucHV0UHJvcENoYW5nZWQoaW5maW5pdGVTY3JvbGxEaXNhYmxlZCk7XG4gICAgY29uc3QgZGlzdGFuY2VDaGFuZ2VkID0gaW5wdXRQcm9wQ2hhbmdlZChpbmZpbml0ZVNjcm9sbERpc3RhbmNlKTtcbiAgICBjb25zdCBzaG91bGRTZXR1cCA9XG4gICAgICAoIWRpc2FibGVkQ2hhbmdlZCAmJiAhdGhpcy5pbmZpbml0ZVNjcm9sbERpc2FibGVkKSB8fFxuICAgICAgKGRpc2FibGVkQ2hhbmdlZCAmJiAhaW5maW5pdGVTY3JvbGxEaXNhYmxlZC5jdXJyZW50VmFsdWUpIHx8XG4gICAgICBkaXN0YW5jZUNoYW5nZWQ7XG5cbiAgICBpZiAoY29udGFpbmVyQ2hhbmdlZCB8fCBkaXNhYmxlZENoYW5nZWQgfHwgZGlzdGFuY2VDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lTY3JvbGxlcigpO1xuICAgICAgaWYgKHNob3VsZFNldHVwKSB7XG4gICAgICAgIHRoaXMuc2V0dXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lTY3JvbGxlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cCgpIHtcbiAgICBpZiAoIWhhc1dpbmRvd0RlZmluZWQoKSkgeyByZXR1cm47IH1cblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2VTY3JvbGxlciA9IGNyZWF0ZVNjcm9sbGVyKHtcbiAgICAgICAgZnJvbVJvb3Q6IHRoaXMuZnJvbVJvb3QsXG4gICAgICAgIGFsd2F5c0NhbGxiYWNrOiB0aGlzLmFsd2F5c0NhbGxiYWNrLFxuICAgICAgICBkaXNhYmxlOiB0aGlzLmluZmluaXRlU2Nyb2xsRGlzYWJsZWQsXG4gICAgICAgIGRvd25EaXN0YW5jZTogdGhpcy5pbmZpbml0ZVNjcm9sbERpc3RhbmNlLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIGhvcml6b250YWw6IHRoaXMuaG9yaXpvbnRhbCxcbiAgICAgICAgc2Nyb2xsQ29udGFpbmVyOiB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICBzY3JvbGxXaW5kb3c6IHRoaXMuc2Nyb2xsV2luZG93LFxuICAgICAgICB0aHJvdHRsZTogdGhpcy5pbmZpbml0ZVNjcm9sbFRocm90dGxlLFxuICAgICAgICB1cERpc3RhbmNlOiB0aGlzLmluZmluaXRlU2Nyb2xsVXBEaXN0YW5jZSxcbiAgICAgIH0pLnN1YnNjcmliZSgocGF5bG9hZCkgPT4gdGhpcy5oYW5kbGVPblNjcm9sbChwYXlsb2FkKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9uU2Nyb2xsKHsgdHlwZSwgcGF5bG9hZCB9OiBJSW5maW5pdGVTY3JvbGxBY3Rpb24pIHtcbiAgICBjb25zdCBlbWl0dGVyID1cbiAgICAgIHR5cGUgPT09IEluZmluaXRlU2Nyb2xsQWN0aW9ucy5ET1dOID8gdGhpcy5zY3JvbGxlZCA6IHRoaXMuc2Nyb2xsZWRVcDtcblxuICAgIGlmIChoYXNPYnNlcnZlcnMoZW1pdHRlcikpIHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gZW1pdHRlci5lbWl0KHBheWxvYWQpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lTY3JvbGxlcigpIHtcbiAgICBpZiAodGhpcy5kaXNwb3NlU2Nyb2xsZXIpIHtcbiAgICAgIHRoaXMuZGlzcG9zZVNjcm9sbGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhc09ic2VydmVyczxUPihlbWl0dGVyOiBFdmVudEVtaXR0ZXI8VD4pOiBib29sZWFuIHtcbiAgLy8gTm90ZTogVGhlIGBvYnNlcnZlZGAgcHJvcGVydHkgaXMgYXZhaWxhYmxlIG9ubHkgaW4gUnhKU0A3LjIuMCwgd2hpY2ggbWVhbnMgaXQnc1xuICAvLyBub3QgYXZhaWxhYmxlIGZvciB1c2VycyBydW5uaW5nIHRoZSBsb3dlciB2ZXJzaW9uLlxuICByZXR1cm4gZW1pdHRlci5vYnNlcnZlZCA/PyBlbWl0dGVyLm9ic2VydmVycy5sZW5ndGggPiAwO1xufVxuIl19