【问题标题】:Angular 2: scroll event not firingAngular 2:滚动事件未触发
【发布时间】:2016-09-28 09:51:12
【问题描述】:

我是 Angular 2 的新手。尝试使用滚动事件进行休息调用。我有 200 条记录,最初我会像这样打一个休息电话

localhost:8080/myapp/records=items&offset=0&limit=50

它将首先获取 50 条记录。但是,当我向下滚动时,它必须再次调用 API 来获取另外 50 条记录,例如

localhost:8080/myapp/records=items&offset=50&limit=50

我试过了,但没有触发事件。

HTML

    <div>
    <table class="doc-table" (scrolled)="onScroll($event.value)">
        <thead>
            <th class="avatar-th"></th>
            <th>Id</th>
            <th>Name</th>
            <th>Price</th>
        </thead>
        <tbody>
            <tr *ngFor="let item of items" (click)="routeTo(item.id)">
                <td>{{item.id}}</td>
                <td>{{item.name}}</td>
                <td>{{item.price}}</td>
            </tr>
        </tbody>
    </table>
   </div>

脚本

 @Component({
  selector: 'item-cmp',
  templateUrl: 'items.component.html'
})
export class PatientsComponent(){
  onScroll(event:any){
    alert("Scolled...");
  }
}

基于偏移量,我必须进行 API 调用。帮帮我,怎么办?

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

    我刚刚遇到这个问题,正在寻找一种方法来告诉 Angular 我希望滚动 (wheel) 事件是被动的(目前还不可能 - #8866)。但您问题的关键词是wheel

    这是一个很老的问题,可能你已经解决了,但是没有发布答案,所以遇到这个问题的人,有同样的问题,不会得到他们的答案。

    这里是:

    没有scrolled 事件。

    至于scroll 事件:它不能简单地委托给任何元素。您可以将其附加到 windowdocument,但不能附加到您的 div

    您正在寻找的是wheel 事件:

    <div (wheel)="onMouseWheel($event)"></div>
    

    然后你可以简单地检查事件在你的组件中提供了什么:

    onMouseWheel(evt) {
        console.log('Wheel event: ', evt);
    }
    

    所以你知道要使用什么...例如“距离”滚动和方向可以从evt.deltaXevt.deltaY 知道。如果deltaX 为正数,则您已水平(在X 轴上)向右滚动。如果它是负数,那么你已经滚动到左边。你明白了。

    P.S.不用担心,即使它被称为wheel,它也会在使用触摸板时触发。我可能应该简单地将我的方法命名为onWheel

    P.P.S. 我看到另一个答案,建议 mousewheelmousewheel 从来都不是标准的并且已被弃用 - MDN link

    我建议使用wheel

    【讨论】:

    • 请不要像依赖 scroll 那样依赖 wheel。摘自上面的 MDN 链接:Don't confuse the wheel event with the scroll event. The default action of a wheel event is implementation-specific, and doesn't necessarily dispatch a scroll event.
    • @ServerKhalilov 不幸的是,我找不到任何其他方式。请注意,这是关于在table(或div 等)上捕获“滚动”,您无法将滚动事件侦听器附加到该对象上。或者,至少,在写这篇文章的时候,你不能(据我所知)......我最近没有再调查过它,因为我没有遇到任何可能有的情况到目前为止使用(wheel) 的任何问题。我想只要你小心点......但是谢谢你的提示!可能会为一些可能遇到一些意外行为的人省去一些麻烦。
    • 我看到的“轮子”的主要问题是当你用箭头滚动窗口时它不起作用。
    【解决方案2】:

    我之前也遇到过同样的问题,解决方案是使用主机侦听器装饰器创建指令。

    @HostListener('scroll', ['$event']) public scrolled($event: Event) {
        this.elementScrollEvent($event);
    }
    

    对于窗口事件

    @HostListener('window:scroll', ['$event']) public 
        windowScrolled($event: Event) {
        this.windowScrollEvent($event);
    }
    

    无论如何,我还发布了一个 NPM 模块来检测滚动事件并确定用户是否正在接近元素底部以加载下一页。

    检查https://www.npmjs.com/package/ngx-scroll-event

    【讨论】:

    • @NNR 如果这个答案对你有用,请告诉我。
    【解决方案3】:

    mousewheel 事件将处理滚动。

    HTML

    <div style="height:1000px" (mousewheel)="mousewheel($event)">
    
    </div>
    

    打字稿

    mousewheel(event){
        console.log(event)
      }
    

    您也可以创建自定义指令并对其进行处理,

     @HostListener('mousewheel', ['$event']) onMousewheel(event) {
               do something
     }
    

    LIVE DEMO

    【讨论】:

    • 它可以在网络平台上运行,但不能在移动设备上运行
    【解决方案4】:

    没有scrolled 事件。

    我认为应该是

    <table class="doc-table" (scroll)="onScroll($event)">
    

    除非scrolled 是您的一些自定义事件。

    【讨论】:

    • 从这里很难判断,也许 table 不是发出滚动事件的元素。
    • “不工作”到底是什么意思。 $event.value 应该做什么。据我所知event 没有value 属性。
    • 我真正想做的是,当我向下滚动到第 50 条记录时,它必须调用 API 以获取另外 50 条记录。
    • 你能创建一个 Plunker 吗?似乎是一个非常简单的用例。如果(scroll)="onScroll($event)" 不起作用,那么我很确定该元素不会触发scroll 事件。
    • 很抱歉来晚了,但它是容器对象正在做的事情。应该是你的路由器。将滚动处理放在那里,它工作正常。
    猜你喜欢
    • 2018-04-13
    • 2016-12-06
    • 2019-02-25
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多