В настоящее время я пытаюсь реализовать ленивую загрузку с помощью IntersectionObserver в моем приложении angularjs.
Но когда я прокручиваю вверх и вниз, он не всегда вызывает функцию обратного вызова наблюдателя.
Моя директива выглядит так:
var app = angular.module("test", []);
app.directive("inViewport", function() {
return {
restrict: "A",
link: function(scope, element, attrs) {
const observer = new IntersectionObserver(callback);
const img = angular.element(element)[0];
observer.observe(img);
function callback(changes) {
changes.forEach(change => {
change.target.classList.toggle(
"visible",
change.intersectionRatio > 0
);
});
}
}
};
});
См. эта ручка для демонстрации.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте change.isIntersecting вместо change.intersectionRatio> 0 в change.target.classList.toggle
Поскольку IntersectionObserver работает асинхронно, при вызове функции обратного вызова будет небольшая задержка.
var app = angular.module("test", []);
app.directive("inViewport", function() {
return {
restrict: "A",
link: function(scope, element, attrs) {
const observer = new IntersectionObserver(callback);
const img = angular.element(element)[0];
observer.observe(img);
function callback(changes) {
changes.forEach(change => {
change.target.classList.toggle(
"visible",
change.isIntersecting
);
});
}
}
};
});.main div {
background: green;
height: 100px;
width: 100%;
margin: 10px;
}
.main div.visible {
background: red;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.17/angular.min.js"></script>
<div ng-app = "test" class = "main">
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
<div in-viewport = ""></div>
</div>