javascript - 如何在页面滚动或调整大小时更新指令

标签 javascript angularjs-directive

我有一个指令,它将两个类设置为一个元素,以识别它在浏览器窗口中的哪个象限(左上、右上、左下、右下)。代码类似于:

angular.module('positionerDirective', [])
  .directive('positioner', function() {
    return {
      restrict: 'A',
      link: function(scope, element){
        var top = element[0].offsetTop;
        var left = element[0].offsetLeft;
        //do whatever math you need here
        angular.element(element).addClass(class you need);
      }
    };
  });

我遇到的问题是,如果用户滚动或更改屏幕尺寸,象限可能会发生变化,如果发生这种情况,我需要更新类。所以我的问题是,如果左侧/顶部发生变化,如何使指令再次运行?

最佳答案

您可以将 Controller 添加到指令中,在其中订阅 resizescroll 的 DOM 事件,并相应地更新类。这是执行此操作的示例:

JavaScript

angular.module('positionerDirective', []).
  directive('positioner', function() {
    return {
      restrict: 'A',
      scope: true, // <- create isolated scope
      link: function(scope, element) {
        var el = element[0];
        scope.$watch(function() {
          return (el.offsetTop - scope.scrollTop)+':'+(el.offsetLeft - scope.scrollLeft); // <- check element class is to be updated
        }, function() {
          el.className = 'top-'+(el.offsetTop - scope.scrollTop)+' left-'+(el.offsetLeft - scope.scrollLeft); // <- apply new element class
        });
      },
      controller: ['$scope', '$window', function($scope, $window) {
        $scope.updatePosition = function() {
          $scope.scrollTop = $window.document.body.scrollTop,
          $scope.scrollLeft = $window.document.body.scrollLeft;
          if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') { // <- Avoid call of $apply while digest is already running
            $scope.$apply();
          }
        }
        angular.element($window).on('resize scroll', function() { // <- subscribe to DOM events and update scope accordingly
          $scope.updatePosition();
        });
        $scope.updatePosition(); // <- set initial values of $scope.scrollTop and $scope.scrollLeft
      }]
    };
  });

骗子:http://plnkr.co/edit/wvYTZ18gY2N5ABODyZO7?p=preview

关于javascript - 如何在页面滚动或调整大小时更新指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22526313/

相关文章:

使用 jQuery 在 Internet Explorer 上出现 Javascript 错误,但在 Firefox 上工作正常

javascript - 如何为 JavaScript 对象设置类名

javascript - 访问指令链接内创建的原型(prototype)

javascript - 点击后如何在 AngularJS 中一一循环使用 JSON

javascript - 无法访问 Jquery 中隐藏字段的值

javascript - AJAX 调用更新表变为 Null - ASP.NET

javascript - 密码保护页面

javascript - 为什么 ng-repeat 不能在使用 Angular 的指令中工作?

javascript - AngularJS 在同一元素上有多个指令,$compile :multidir ERROR

angularjs - 如何创建要在任何模块中使用的指令?