【问题标题】:Scroll event is not fired inside directive - angular.js滚动事件不会在指令内触发 - angular.js
【发布时间】:2020-04-11 00:00:22
【问题描述】:

我遇到了问题。我有一个无限滚动指令,我在其中监听 scroll 事件。问题是只有当我绑定到$window时才会触发滚动事件:

angular.element($window).bind('scroll', function () {
  console.log('Gogo!'); //works!
});

element.bind('scroll', function () {
  console.log('Gogo!'); //doesn't work... :(((
});

Directive 在 ng-view 里面我发现了这个问题,看起来和我的问题很相似 - Binding to events in a directive which is inside a ng-view doesn't work

有人知道如何解决这个问题吗?

我的指令:

directives.directive('scrolly', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            var raw = element[0];

            element.bind('scroll', function () {
                if (raw.scrollTop + raw.offsetHeight > raw.scrollHeight) {
                    scope.$apply(attrs.scrolly);
                }
            });
        }
    };
});

我的看法:

<ul class="items-wrap" scrolly="showMore()">
   <li class="item" ng-repeat="item in items">{{item.name}}</li>
</ul>

【问题讨论】:

  • 请粘贴您的视图和指令代码。
  • @MattWay 添加了代码 sn-ps

标签: javascript angularjs events scroll dom-events


【解决方案1】:

这可能是因为您绑定的元素没有“滚动”。

您实际滚动的节点(文档,或者可能带有滚动溢出的 div)是实际触发事件的对象。

尝试将$document 注入您的指令并在其上设置滚动事件:

$document.bind('scroll', function (){});

另外,放弃处理程序内部的 if 语句,直到您确定事件正确触发,然后将其添加回来。

刚刚开始:

app.directive('scrolly', function ($document) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {

            $document.bind('scroll', function () {
                scope.$apply(attrs.scrolly);
            });
        }
    };
});

然后检查元素定位和其他逻辑。

希望对你有帮助。

【讨论】:

  • +1 这可能是因为您要绑定的元素没有“滚动”——这正是滚动事件未触发的确切原因。在我的情况下,表在 div 内,div 可以滚动但不能滚动。
  • @Ben Lesh,+1 因为我遇到了同样的问题:“scrolly”没有被解雇,因为“overflow-x: none;”在我的
    上! (在 Chrome 54 和 I.E. 11 上测试)。解决方法是设置样式“overflow:scroll;”
  • 我认为这是来自 Angular 的一个错误,因为它在使用像 "document.getElementById("myDIV").onscroll = function() {....}" 这样的纯 JS 时效果很好样式“溢出-x:无;”
【解决方案2】:

我在这里为你创建了一个小提琴:http://jsfiddle.net/ADukg/4831/

有趣的是,我使用了您的确切代码,并且一切似乎都很好(查看所有乱七八糟的 console.log() 调用)。我怀疑您的问题与您的 CSS 样式有关,因为如果没有正确使用溢出,我无法触发滚动事件。

【讨论】:

  • 是的,当我将overflow: scroll 添加到ul 时,它会触发事件.. 但它对用户界面不太好..
  • 嗨@Matt Way 当我使用此代码时,这给了我scope.$apply(attrs.scrolly) undefined 的错误。是的,你能帮帮我吗?
猜你喜欢
相关资源
最近更新 更多
热门标签