angular2-infinite-scroll
Version:
An infinite scroll directive for angular2
113 lines • 15.4 kB
JavaScript
"use strict";
var core_1 = require('@angular/core');
var axis_resolver_1 = require('./axis-resolver');
var PositionResolverFactory = (function () {
function PositionResolverFactory(axisResolver) {
this.axisResolver = axisResolver;
}
PositionResolverFactory.prototype.create = function (options) {
return new PositionResolver(this.axisResolver.create(!options.horizontal), options);
};
PositionResolverFactory.decorators = [
{ type: core_1.Injectable },
];
/** @nocollapse */
PositionResolverFactory.ctorParameters = function () { return [
{ type: axis_resolver_1.AxisResolverFactory, },
]; };
return PositionResolverFactory;
}());
exports.PositionResolverFactory = PositionResolverFactory;
var PositionResolver = (function () {
function PositionResolver(axis, options) {
this.axis = axis;
this.options = options;
this.resolveContainer(this.options.windowElement);
this.defineContainer(this.options.windowElement);
}
PositionResolver.prototype.defineContainer = function (windowElement) {
if (this.resolveContainer(windowElement) || !windowElement.nativeElement) {
this.container = windowElement;
}
else {
this.container = windowElement.nativeElement;
}
return this.container;
};
PositionResolver.prototype.resolveContainer = function (windowElement) {
var isContainerWindow = Object.prototype.toString.call(windowElement).includes('Window');
this.isContainerWindow = isContainerWindow;
return isContainerWindow;
};
PositionResolver.prototype.getDocumentElement = function () {
return this.isContainerWindow
? this.options.windowElement.document.documentElement
: null;
};
PositionResolver.prototype.calculatePoints = function (element) {
return this.isContainerWindow
? this.calculatePointsForWindow(element)
: this.calculatePointsForElement(element);
};
PositionResolver.prototype.calculatePointsForWindow = function (element) {
// container's height
var height = this.height(this.container);
// scrolled until now / current y point
var scrolledUntilNow = height + this.pageYOffset(this.getDocumentElement());
// total height / most bottom y point
var totalToScroll = this.offsetTop(element.nativeElement) + this.height(element.nativeElement);
return { height: height, scrolledUntilNow: scrolledUntilNow, totalToScroll: totalToScroll };
};
PositionResolver.prototype.calculatePointsForElement = function (element) {
var scrollTop = this.axis.scrollTopKey();
var scrollHeight = this.axis.scrollHeightKey();
var container = this.container;
var height = this.height(container);
// perhaps use this.container.offsetTop instead of 'scrollTop'
var scrolledUntilNow = container[scrollTop];
var containerTopOffset = 0;
var offsetTop = this.offsetTop(container);
if (offsetTop !== void 0) {
containerTopOffset = offsetTop;
}
var totalToScroll = container[scrollHeight];
return { height: height, scrolledUntilNow: scrolledUntilNow, totalToScroll: totalToScroll };
};
PositionResolver.prototype.height = function (elem) {
var offsetHeight = this.axis.offsetHeightKey();
var clientHeight = this.axis.clientHeightKey();
// elem = elem.nativeElement;
if (isNaN(elem[offsetHeight])) {
return this.getDocumentElement()[clientHeight];
}
else {
return elem[offsetHeight];
}
};
PositionResolver.prototype.offsetTop = function (elem) {
var top = this.axis.topKey();
// elem = elem.nativeElement;
if (!elem.getBoundingClientRect) {
return;
}
return elem.getBoundingClientRect()[top] + this.pageYOffset(elem);
};
PositionResolver.prototype.pageYOffset = function (elem) {
var pageYOffset = this.axis.pageYOffsetKey();
var scrollTop = this.axis.scrollTopKey();
var offsetTop = this.axis.offsetTopKey();
// elem = elem.nativeElement;
if (isNaN(window[pageYOffset])) {
return this.getDocumentElement()[scrollTop];
}
else if (elem.ownerDocument) {
return elem.ownerDocument.defaultView[pageYOffset];
}
else {
return elem[offsetTop];
}
};
return PositionResolver;
}());
exports.PositionResolver = PositionResolver;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb24tcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwb3NpdGlvbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUJBQXVDLGVBQWUsQ0FBQyxDQUFBO0FBQ3ZELDhCQUFrRCxpQkFBaUIsQ0FBQyxDQUFBO0FBSXBFO0lBRUUsaUNBQW9CLFlBQWlDO1FBQWpDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtJQUNyRCxDQUFDO0lBRUQsd0NBQU0sR0FBTixVQUFRLE9BQXlCO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDSSxrQ0FBVSxHQUEwQjtRQUMzQyxFQUFFLElBQUksRUFBRSxpQkFBVSxFQUFFO0tBQ25CLENBQUM7SUFDRixrQkFBa0I7SUFDWCxzQ0FBYyxHQUFtRSxjQUFNLE9BQUE7UUFDOUYsRUFBQyxJQUFJLEVBQUUsbUNBQW1CLEdBQUc7S0FDNUIsRUFGNkYsQ0FFN0YsQ0FBQztJQUNGLDhCQUFDO0FBQUQsQ0FBQyxBQWZELElBZUM7QUFmWSwrQkFBdUIsMEJBZW5DLENBQUE7QUFFRDtJQUtFLDBCQUFxQixJQUFrQixFQUFVLE9BQXlCO1FBQXJELFNBQUksR0FBSixJQUFJLENBQWM7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN4RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELDBDQUFlLEdBQWYsVUFBZ0IsYUFBMkI7UUFDekMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJ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O1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBQ0gsdUJBQUM7QUFBRCxDQUFDLEFBcEdELElBb0dDO0FBcEdZLHdCQUFnQixtQkFvRzVCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBeGlzUmVzb2x2ZXIsIEF4aXNSZXNvbHZlckZhY3RvcnkgfSBmcm9tICcuL2F4aXMtcmVzb2x2ZXInO1xuaW1wb3J0IHsgQ29udGFpbmVyUmVmLCBQb3NpdGlvbkVsZW1lbnRzLCBQb3NpdGlvblN0YXRzIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvblJlc29sdmVyRmFjdG9yeSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBheGlzUmVzb2x2ZXI6IEF4aXNSZXNvbHZlckZhY3RvcnkpIHtcbiAgfVxuXG4gIGNyZWF0ZSAob3B0aW9uczogUG9zaXRpb25FbGVtZW50cykge1xuICAgIHJldHVybiBuZXcgUG9zaXRpb25SZXNvbHZlcih0aGlzLmF4aXNSZXNvbHZlci5jcmVhdGUoIW9wdGlvbnMuaG9yaXpvbnRhbCksIG9wdGlvbnMpO1xuICB9XG5zdGF0aWMgZGVjb3JhdG9yczogRGVjb3JhdG9ySW52b2NhdGlvbltdID0gW1xueyB0eXBlOiBJbmplY3RhYmxlIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5zdGF0aWMgY3RvclBhcmFtZXRlcnM6ICgpID0+ICh7dHlwZTogYW55LCBkZWNvcmF0b3JzPzogRGVjb3JhdG9ySW52b2NhdGlvbltdfXxudWxsKVtdID0gKCkgPT4gW1xue3R5cGU6IEF4aXNSZXNvbHZlckZhY3RvcnksIH0sXG5dO1xufVxuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25SZXNvbHZlciB7XG4gIHByaXZhdGUgZG9jdW1lbnRFbGVtZW50OiBDb250YWluZXJSZWY7XG4gIHByaXZhdGUgaXNDb250YWluZXJXaW5kb3c6IGJvb2xlYW47XG4gIHB1YmxpYyBjb250YWluZXI6IENvbnRhaW5lclJlZjtcblxuICBjb25zdHJ1Y3RvciAocHJpdmF0ZSBheGlzOiBBeGlzUmVzb2x2ZXIsIHByaXZhdGUgb3B0aW9uczogUG9zaXRpb25FbGVtZW50cykge1xuICAgIHRoaXMucmVzb2x2ZUNvbnRhaW5lcih0aGlzLm9wdGlvbnMud2luZG93RWxlbWVudCk7XG4gICAgdGhpcy5kZWZpbmVDb250YWluZXIodGhpcy5vcHRpb25zLndpbmRvd0VsZW1lbnQpO1xuICB9XG5cbiAgZGVmaW5lQ29udGFpbmVyKHdpbmRvd0VsZW1lbnQ6IENvbnRhaW5lclJlZikge1xuICAgIGlmICh0aGlzLnJlc29sdmVDb250YWluZXIod2luZG93RWxlbWVudCkgfHwgIXdpbmRvd0VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5jb250YWluZXIgPSB3aW5kb3dFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHdpbmRvd0VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG5cbiAgcmVzb2x2ZUNvbnRhaW5lcih3aW5kb3dFbGVtZW50OiBDb250YWluZXJSZWYpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0NvbnRhaW5lcldpbmRvdyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3dFbGVtZW50KS5pbmNsdWRlcygnV2luZG93Jyk7XG4gICAgdGhpcy5pc0NvbnRhaW5lcldpbmRvdyA9IGlzQ29udGFpbmVyV2luZG93O1xuICAgIHJldHVybiBpc0NvbnRhaW5lcldpbmRvdztcbiAgfVxuXG4gIGdldERvY3VtZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbnRhaW5lcldpbmRvd1xuICAgICAgPyB0aGlzLm9wdGlvbnMud2luZG93RWxlbWVudC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZVBvaW50cyAoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgIHJldHVybiB0aGlzLmlzQ29udGFpbmVyV2luZG93XG4gICAgICA/IHRoaXMuY2FsY3VsYXRlUG9pbnRzRm9yV2luZG93KGVsZW1lbnQpXG4gICAgICA6IHRoaXMuY2FsY3VsYXRlUG9pbnRzRm9yRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVBvaW50c0ZvcldpbmRvdyAoZWxlbWVudDogRWxlbWVudFJlZik6IFBvc2l0aW9uU3RhdHMge1xuICAgIC8vIGNvbnRhaW5lcidzIGhlaWdodFxuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0KHRoaXMuY29udGFpbmVyKTtcbiAgICAvLyBzY3JvbGxlZCB1bnRpbCBub3cgLyBjdXJyZW50IHkgcG9pbnRcbiAgICBjb25zdCBzY3JvbGxlZFVudGlsTm93ID0gaGVpZ2h0ICsgdGhpcy5wYWdlWU9mZnNldCh0aGlzLmdldERvY3VtZW50RWxlbWVudCgpKTtcbiAgICAvLyB0b3RhbCBoZWlnaHQgLyBtb3N0IGJvdHRvbSB5IHBvaW50XG4gICAgY29uc3QgdG90YWxUb1Njcm9sbCA9IHRoaXMub2Zmc2V0VG9wKGVsZW1lbnQubmF0aXZlRWxlbWVudCkgKyB0aGlzLmhlaWdodChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHJldHVybiB7IGhlaWdodCwgc2Nyb2xsZWRVbnRpbE5vdywgdG90YWxUb1Njcm9sbCB9O1xuICB9XG5cbiAgY2FsY3VsYXRlUG9pbnRzRm9yRWxlbWVudCAoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgIGxldCBzY3JvbGxUb3AgICAgPSB0aGlzLmF4aXMuc2Nyb2xsVG9wS2V5KCk7XG4gICAgbGV0IHNjcm9sbEhlaWdodCA9IHRoaXMuYXhpcy5zY3JvbGxIZWlnaHRLZXkoKTtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcblxuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0KGNvbnRhaW5lcik7XG4gICAgLy8gcGVyaGFwcyB1c2UgdGhpcy5jb250YWluZXIub2Zmc2V0VG9wIGluc3RlYWQgb2YgJ3Njcm9sbFRvcCdcbiAgICBjb25zdCBzY3JvbGxlZFVudGlsTm93ID0gY29udGFpbmVyW3Njcm9sbFRvcF07XG4gICAgbGV0IGNvbnRhaW5lclRvcE9mZnNldCA9IDA7XG4gICAgY29uc3Qgb2Zmc2V0VG9wID0gdGhpcy5vZmZzZXRUb3AoY29udGFpbmVyKTtcbiAgICBpZiAob2Zmc2V0VG9wICE9PSB2b2lkIDApIHtcbiAgICAgIGNvbnRhaW5lclRvcE9mZnNldCA9IG9mZnNldFRvcDtcbiAgICB9XG4gICAgY29uc3QgdG90YWxUb1Njcm9sbCA9IGNvbnRhaW5lcltzY3JvbGxIZWlnaHRdO1xuICAgIHJldHVybiB7IGhlaWdodCwgc2Nyb2xsZWRVbnRpbE5vdywgdG90YWxUb1Njcm9sbCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoZWlnaHQgKGVsZW06IGFueSkge1xuICAgIGxldCBvZmZzZXRIZWlnaHQgPSB0aGlzLmF4aXMub2Zmc2V0SGVpZ2h0S2V5KCk7XG4gICAgbGV0IGNsaWVudEhlaWdodCA9IHRoaXMuYXhpcy5jbGllbnRIZWlnaHRLZXkoKTtcblxuICAgIC8vIGVsZW0gPSBlbGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGlzTmFOKGVsZW1bb2Zmc2V0SGVpZ2h0XSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERvY3VtZW50RWxlbWVudCgpW2NsaWVudEhlaWdodF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtW29mZnNldEhlaWdodF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvZmZzZXRUb3AgKGVsZW06IGFueSkge1xuICAgIGxldCB0b3AgPSB0aGlzLmF4aXMudG9wS2V5KCk7XG5cbiAgICAvLyBlbGVtID0gZWxlbS5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHsgLy8gfHwgZWxlbS5jc3MoJ25vbmUnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0b3BdICsgdGhpcy5wYWdlWU9mZnNldChlbGVtKTtcbiAgfVxuXG4gIHBhZ2VZT2Zmc2V0IChlbGVtOiBhbnkpIHtcbiAgICBsZXQgcGFnZVlPZmZzZXQgPSB0aGlzLmF4aXMucGFnZVlPZmZzZXRLZXkoKTtcbiAgICBsZXQgc2Nyb2xsVG9wICAgPSB0aGlzLmF4aXMuc2Nyb2xsVG9wS2V5KCk7XG4gICAgbGV0IG9mZnNldFRvcCAgID0gdGhpcy5heGlzLm9mZnNldFRvcEtleSgpO1xuXG4gICAgLy8gZWxlbSA9IGVsZW0ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoaXNOYU4od2luZG93W3BhZ2VZT2Zmc2V0XSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERvY3VtZW50RWxlbWVudCgpW3Njcm9sbFRvcF07XG4gICAgfSBlbHNlIGlmIChlbGVtLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXdbcGFnZVlPZmZzZXRdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbVtvZmZzZXRUb3BdO1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVjb3JhdG9ySW52b2NhdGlvbiB7XG4gIHR5cGU6IEZ1bmN0aW9uO1xuICBhcmdzPzogYW55W107XG59XG4iXX0=