IntersectionObserver не всегда запускает директиву angularjs - PullRequest
0 голосов
/ 15 мая 2018

В настоящее время я пытаюсь реализовать отложенную загрузку с помощью 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
          );
        });
      }
    }
  };
});

См. эту ручку для демонстрации.

1 Ответ

0 голосов
/ 13 марта 2019

Используйте 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...