Skip to content

Instantly share code, notes, and snippets.

@chirino
Created February 17, 2017 15:35
Show Gist options
  • Save chirino/4bc639c3dce575f1698cd1a88ccaa4b0 to your computer and use it in GitHub Desktop.
Save chirino/4bc639c3dce575f1698cd1a88ccaa4b0 to your computer and use it in GitHub Desktop.
app.directive('infiniteScroll', [
'$rootScope', '$window', '$timeout', function($rootScope, $window, $timeout) {
return {
link: function(scope, elem, attrs) {
var checkWhenEnabled, handler, primer, primed, scrollDistance, scrollEnabled;
$window = angular.element(Scrollparent(elem.get(0)))
scrollDistance = 0;
if (attrs.infiniteScrollDistance != null) {
scope.$watch(attrs.infiniteScrollDistance, function(value) {
return scrollDistance = parseInt(value, 10);
});
}
scrollEnabled = true;
checkWhenEnabled = false;
if (attrs.infiniteScrollDisabled != null) {
scope.$watch(attrs.infiniteScrollDisabled, function(value) {
scrollEnabled = !value;
if (scrollEnabled && checkWhenEnabled) {
checkWhenEnabled = false;
return handler();
}
});
}
primed = false;
handler = function() {
var elementBottom, remaining, shouldScroll, windowBottom;
var windowHeight = $window.height();
windowBottom = windowHeight + $window.scrollTop();
elementBottom = elem.offset().top + elem.height();
remaining = elementBottom - windowBottom;
shouldScroll = remaining <= windowHeight * scrollDistance;
if (shouldScroll && scrollEnabled) {
if ($rootScope.$$phase) {
primed |= scope.$eval(attrs.infiniteScroll);
} else {
primed |= scope.$apply(attrs.infiniteScroll);
}
} else if (shouldScroll) {
checkWhenEnabled = true;
} else {
primed = true;
}
};
primer = function() {
if( !primed ) {
handler();
if( !primed ) {
return $timeout(primer, 0);
}
}
}
$window.on('scroll', handler);
scope.$on('$destroy', function() {
primed = true;
return $window.off('scroll', handler);
});
return $timeout((function() {
if (attrs.infiniteScrollImmediateCheck) {
if (scope.$eval(attrs.infiniteScrollImmediateCheck)) {
return primer();
}
} else {
return primer();
}
}), 0);
}
};
}
]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment