angular / components

Component infrastructure and Material Design components for Angular
https://material.angular.io
MIT License
24.27k stars 6.71k forks source link

Scroll events not getting fired when content inside md-content is scrolled #802

Closed ghostofcain closed 6 years ago

ghostofcain commented 8 years ago

Bug, feature request, or proposal:

Bug

What is the expected behavior?

When you scroll the page and the md-content's height is larger than the available space, page scroll events should be fired.

What is the current behavior?

They don't get fired.

Please note, this was working correctly in the alpha5 version but now it's broken in v2.0.0.-alpha6.

To add further information, consider this to be the layout:

<md-sidenav-layout>
    <md-sidenav #sidenav>
        <md-nav-list>
            ...
    </md-sidenav>
    <md-toolbar style="background-color: #2db1eb; color: white">
            ...
    </md-toolbar>
    <router-outlet></router-outlet>
</md-sidenav-layout>

When the content placed inside is larger than the available height, the scroll events are not firing. This is preventing me from implementing infinite scroll on various components.

Can you please let me know if there is a workaround for this?

Many thanks,

mrusful commented 8 years ago

Looks like #703 change behavior. scroll event fires by md-content.

As a workaround, i think, you can wrap all what not in md-sidenav into div and listen scroll event on it.

<div (scroll)="handleScroll($event.target)" style="height: 100%; overflow: auto;">
    <md-toolbar style="background-color: #2db1eb; color: white">
        ...
    </md-toolbar>
    <router-outlet></router-outlet>
</div>
karser commented 7 years ago

overflow: auto; doesn't look good, so it's not an option. An alternative solution is to not use fullscreen on md-sidenav-layout. Some CSS tweaks help, although, if I set body { height:100%; } it also breaks document:scroll event listener.

matte00 commented 7 years ago

I confirm it, without fullscreen it's works. So if you want have scroll content insiede sidenav you could use scroll event on div content. For example:


<md-sidenav-container fullscreen>
    <md-sidenav align="start" #drleft>
    </md-sidenav>
    <div layout="column" layout-fill>    
      <div flex layout="column" class="content md-content" (scroll)="onScroll($event)">
        put here your scrollable data
      </div>
    </div>
  </md-sidenav-container>
twoheaded commented 7 years ago

Looks like something wrong with it. I have no idea how to handle scroll event in my app with md-sidenav. Plunker

willshowell commented 7 years ago

@twoheaded Here's one way to do it https://plnkr.co/edit/BjOKFrP5mNOdVI8d2EKl?p=preview

@mmalerba would it be possible to expose the Scrollable instance? That would give user's the ability to subscribe to elementScrolled() instead of having to use document.querySelector()

twoheaded commented 7 years ago

@willshowell Thanks again! The solution though working, but not very pretty as for me. It's bad that the ability to handle scroll events by the native Angular way is lost

mmalerba commented 7 years ago

@willshowell I'm currently looking into how to make the sidenav work better for mobile use cases (where people typically want a fixed position sidenav and the scroll events get fired on the body, so that the browser chrome will scroll out of view). I'll think about this too while I'm prototyping. What if we just give developers control of the content element? That seems like the easiest solution to this issue. For example:

<md-sidenav-container>
  <md-sidenav>My sidenav</md-sidenav>
  <md-sidenav-content (scroll)="...">My content</md-sidenav-content>
</md-sidenav-container>
willshowell commented 7 years ago

@mmalerba IMO that sounds more versatile and I like that it's a little more prescriptive

twoheaded commented 7 years ago

It seems to me that there is some shortcoming in sidenav architecture. I do not understand why the side navigation should wrap a content and override properties and behavior of main container. IMO sidenav should be in the container next to other content, rather than around it. For exemple md-toolbar doesn't wrap main content. Because of this, there are problems with scrolling and positioning of elements.

jelbourn commented 6 years ago

@mmalerba can we close this now that fixed sidenav is in master?

mmalerba commented 6 years ago

yep, fixed sidenav is in now, and docs are coming in https://github.com/angular/material2/pull/7775

ghost commented 6 years ago

Thank you @mrusful for leading me on the way.

I had no success using the scroll events, been looking for an hour, and you gave me the hint to put my scroll event on my mat-sidenav-content element (I wanted scroll events on my content).

angular-automatic-lock-bot[bot] commented 4 years ago

This issue has been automatically locked due to inactivity. Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.