This directive uses a scroll offset to give the component elasticity, rather than restricting it to a fixed height:
app.directive('whenScrolled', function($window, $timeout) { return { restrict: "A", link: function(scope, element, attr) { // bind the digest cycle to be triggered by the scroll event // when it exceeds a threshold angular.element($window).bind('scroll', function() { var supportPageOffset = window.pageXOffset !== undefined; var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat"); var scrollY = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop; var iScroll = element.prop('offsetTop') + element.prop('offsetHeight'); var iScrooling = scrollY + ( this.screen.height * 0.9 ); //console.log(iScrooling+'/'+iScroll); if ( iScrooling >= iScroll ) { angular.element($window)[0].requestAnimationFrame(function(){ // invoke the function passed into the 'whenScrolled' attribute scope.$apply(attr.whenScrolled); }) } }); } } });
Your HTML:
<div class="tileContainer" ng-controller="OffersCntl"> <h2>Something very important :)</h2> <div id="tiles" class="tiles" when-scrolled="loadMore()"> <div ng-repeat="item in items"> {{ item.id }} </div> </div> </div>
Controller, you can replace it with an Ajax request
$scope.items = []; var counter = 0; $scope.loadMore = function() { for (var i = 0; i < 5; i++) { $scope.items.push({id: counter}); counter += 10; } }; $scope.loadMore();
If you need support for older browsers, you can add this function:
//requestAnimationFrame for old browsers (function() { var lastTime = 0; var vendors = ['webkit', 'moz']; for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) { clearTimeout(id); }; }());
source share