[Tabs] Toggling quickly can cause content to be duplicated
- Dominant language
- TypeScript
- Stars
- 25k
- Forks
- 6.8k
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 91
Description
#### Bug, 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.
Contributor guide
Research direction
Start by running the StackBlitz reproduction in app/app.component.ts and exercising rapid keyboard selection with lazy-loaded tabs, NgForTrackBy, OnPush, and setTimeout. Trace the tab content rendering path to identify why content appears more than once; done means the reproduction keeps exactly one instance under repeated rapid toggling.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- angular, typescript
- Domain
- frontend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100