【问题标题】:How to bind scroll event on element in AngularJS directive如何在AngularJS指令中的元素上绑定滚动事件
【发布时间】:2017-10-21 08:31:18
【问题描述】:

如何在 AngularJS 指令中的元素上绑定滚动事件?

我在 $window 上绑定滚动,但现在我需要将其更改为此类 ".body-wrapper" (angular.element(document.queryselector(.body-wrapper)) 不起作用)。

有什么想法吗?

angular.element($window).bind("scroll", function () { 
   ...
})

【问题讨论】:

标签: javascript angularjs scroll bind


【解决方案1】:

没有理由它不应该工作。

这个简单的例子说明了它确实-

var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
  angular.element(document.querySelector('.myDiv')).bind('scroll', function(){
      alert('scrolling is cool!');
    })
});

Plunker example

如果由于某种原因无法正常工作,请发布完整代码。

讨论后编辑:

最终问题出在“滚动”的特定事件上,它可能与另一个事件发生冲突。

将事件更改为“鼠标滚轮”就可以了。

Working fiddle

【讨论】:

  • 谢谢,但我如何在指令中使用它? angular.element(document.querySelector('.ngscroll-container')).bind('scroll', function(){ alert('滚动很酷!'); });不工作
  • “.ngscroll-container”是否在指令的html模板中?
  • 它从另一个角度指令(自定义滚动条)生成
  • 你能发布你的代码或其中的一部分,它正在工作并显示错误吗?
  • 你能把html添加到fiddle吗?
【解决方案2】:

你通常会为此制定一个新指令。

app.directive('scroll', [function() {
  return {
    link: function (scope, elem, attrs) {
      elem.on('scroll', function (e) {
        // do your thing
      });
    })
  }
}]);

现在,在需要添加滚动事件的地方使用此指令。

<div class='.body-wrapper' scroll></div>

指令是在 Angularjs 中访问 DOM 元素的首选和更简洁的方法,而不是 angular.element

【讨论】:

  • 这种方式也很好,但我有一些问题......在主指令中我已经使用了另一个元素。我可以使用 2 指令,但它不是我认为的最佳方式:/
  • 你能详细说明一下吗?在一个元素上有两个指令,或者在另一个指令的模板中有指令不是问题。您可能已经在以这种方式使用其他指令(如 ngClick、ngHref)。
【解决方案3】:

我找到的最干净的方法是:

(function() {
  angular
  .module('yourAppName')
  .directive('scrollDirective', ['$window', scrollDirective])

  function scrollDirective($window) {
    return {
      link: function (scope, element, attrs) {
        var handler;
        $window = angular.element($window);

        handler = function() {
          console.log('scrolling....')
        };

        $window.on('scroll', handler);
      }
    };

  };

})();

然后你可以在你的 Html 中使用它:

 <div scroll-directive="">a long list goes here</div>

【讨论】:

    【解决方案4】:

    mousewheel事件比scroll事件触发到窗口的滚动事件。

    angular.element($window).bind('mousewheel', function () {  
      // enter code here  
    }
    

    【讨论】:

    • 您可以在不使用鼠标滚轮的情况下滚动元素,因此此答案可能不适用于所有情况。
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 2017-06-02
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多