Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 2: scroll event not firing

I am new to Angular 2. Trying to make rest call using scroll event. I have 200 records where initially I will make a rest call like this

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

It will fetch 50 records first. But, when I scroll down it has to make another API call for fetching another 50 records like

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

I tried this, but not firing the event.

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>

Script

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

Bases on offset I have to make API call. Help me, how to do this?

like image 541
Nagarjuna Reddy Avatar asked Sep 28 '16 09:09

Nagarjuna Reddy


2 Answers

I just came across this, looking for a way to tell Angular that I want the scroll (wheel) event to be passive (not possible yet - #8866). But the key word here for your question is wheel.

This is a pretty old question, probably you've already solved it, but there is no answer posted so those who come across this, having the same problem, will not get their answer.

Here it is:

There is no scrolled event.

As for the scroll event: it can't simply be delegated to just any element. You can attach it to window or document, but not to your div.

What you're looking for is the wheel event:

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

Then you can simply check what the event provides in your component:

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

So you know what to use... For example the "distance" scrolled and the direction can be known from evt.deltaX, evt.deltaY. If deltaX is positive, then you've scrolled horizontally (on the X axis) to the right. If it's negative, then you've scrolled to the left. You get the point.

P.S. And don't worry, even though it's called wheel, it also fires when using the touchpad. I probably should have named my method simply onWheel.

P.P.S. I see another answer, suggesting mousewheel. mousewheel was never standard and is deprecated - MDN link

I suggest using wheel.

like image 124
MrCroft Avatar answered Sep 23 '22 01:09

MrCroft


I had the same issue before and the solution was to create a directive with a host listener decorator.

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

and for window events

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

in any case, i have also published an NPM module to detect scroll events and to find out if the user is approaching the bottom of the element to load the next page or not.

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

like image 44
Anas Al Hamdan Avatar answered Sep 23 '22 01:09

Anas Al Hamdan