[Tabs] Toggling quickly can cause content to be duplicated
See original GitHub issueBug, feature request, or proposal:
I have had some trouble reproducing this one reliably (it seems to occur more often on my app than in reproductions) but there seems to be a race condition related to the rendering of tab content when it is lazy-loaded.
What is the expected behavior?
Tab content should only be displayed once.
What is the current behavior?
Toggling tabs very quickly (using arrow keys + space bar) can cause tab content to be drawn multiple times.
What are the steps to reproduce?
StackBlitz: https://stackblitz.com/edit/angular-material2-issue-h6pgut?file=app%2Fapp.component.ts
I am intentionally trying to be awkward in terms of timing (ie. setting the selectedTabIndex
in a timeout), but this behaviour still should not happen.
I have recorded a reproduction in this video: https://gfycat.com/ReadyFairBasil Note that at the start there is only one instance of each tab’s content but by the end the second tab’s content is duplicated.
What is the use-case or motivation for changing an existing behavior?
Bug
Which versions of Angular, Material, OS, TypeScript, browsers are affected?
Latest StackBlitz (Angular 6-rc2, Material 6-rc1)
Is there anything else we should know?
I could only reproduce by using lazy-loaded tabs + NgForTrackBy + OnPush + window.setTimeout, but these may not be necessary. I also had to use keyboard selection to toggle fast enough to trigger the issue.
Issue Analytics
- State:
- Created 5 years ago
- Reactions:5
- Comments:10 (1 by maintainers)
Top GitHub Comments
@benelliott The problem is the animation. If you disable it, the problem disappears.
This would also fit the ~500ms observation from @xyz247.
Possibly related to https://github.com/angular/angular/issues/26133
Simple Workaround
This only works if you have only one base element inside each tabContent template
For Example
Listen to the output on the
<mat-tab-group>
for (animationDone)On Animation done, we want to look for any additional
.tab-containers
that have been rendered inside the active tab.