Closed ghostofcain closed 6 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>
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.
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>
Looks like something wrong with it. I have no idea how to handle scroll event in my app with md-sidenav. Plunker
@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()
@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
@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>
@mmalerba IMO that sounds more versatile and I like that it's a little more prescriptive
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.
@mmalerba can we close this now that fixed sidenav is in master?
yep, fixed sidenav is in now, and docs are coming in https://github.com/angular/material2/pull/7775
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).
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.
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:
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,