Я решил это так на одном из моих сайтов.
angular.module("Directives")
.directive("rjOnScrollTo", [
"scroll", "$window", "$rootScope",
function(scroll, $window, $rootScope) {
function link($scope, $element) {
var offset = 100;
var pageLoaded = false;
var uniqueId = "rjOnScrollTo_" + $element.get(0).id;
var onScroll = function() {
if (pageLoaded && $window.scrollTop() + $window.height() - offset >= $element.offset().top) {
$element.addClass($scope.className);
scroll.removeCallback($window, uniqueId);
}
};
scroll.addCallback($window, uniqueId, onScroll);
$scope.$on("$destroy", function() {
scroll.removeCallback($window, uniqueId);
});
$scope.$on("$routeChangeSuccess", function() {
pageLoaded = false;
});
$scope.$on("pageLoaded", function() {
pageLoaded = true;
onScroll();
});
}
return {
link: link,
restrict: "A",
scope: {
"className": "@rjOnScrollTo"
}
};
}]);
Использование так:
<div data-rj-on-scroll-to="my-class"></div>
Edit:
Вы можете передать параметр смещения в, а не жестко закодировать его.
Служба, которая загружает данные с внешнего сервера через AJAX, запускает событие «pageLoaded». В моем случае было важно дождаться, когда содержимое страницы будет полностью загружено, иначе div будет сразу же рассмотрен, и класс будет добавлен сразу.
Я создал [CodePen] (http://codepen.io/DominikK/pen/QyYRZo), демонстрирующий ваш ответ. При прокрутке к элементу я не вижу добавленного класса. Также консоль показывает «Ошибка: [$ инжектор: unpr]». –