-
Notifications
You must be signed in to change notification settings - Fork 6.8k
feat(tabs): add ability to lazy load tab content #8921
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
4b19c58
17715ec
36f2dd2
02241d9
3b0e4e8
b66b2d7
fc450ed
65e423b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
/** | ||
* @license | ||
* Copyright Google LLC All Rights Reserved. | ||
* | ||
* Use of this source code is governed by an MIT-style license that can be | ||
* found in the LICENSE file at https://angular.io/license | ||
*/ | ||
|
||
import {Directive, TemplateRef} from '@angular/core'; | ||
|
||
/** Decorates the `ng-template` tags and reads out the template from it. */ | ||
@Directive({selector: '[matTabContent]'}) | ||
export class MatTabContent { | ||
constructor(public template: TemplateRef<any>) { } | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -80,6 +80,34 @@ The `tab-nav-bar` is not tied to any particular router; it works with normal `<a | |
the `active` property to determine which tab is currently active. The corresponding | ||
`<router-outlet>` can be placed anywhere in the view. | ||
|
||
## Lazy Loading | ||
By default, the tab contents are eagerly loaded. Eagerly loaded tabs | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we mention here about how lazy-loading resolves issues with components that expect to be in the DOM while they setup? e.g. expansion panels and nested ink bars. I suspect we'll want a place to point people to as we continue to get issues about this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Preferably yes. I'm waiting on a fix to #5269, to render expansion panels within tabs....as are others. I'll probably use lazy loading in combination with a the Progress Spinner component since I render many expansion panels within a tab (see EDIT view on JSONSchema.Net). Eagerly awaiting this feature :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @andrewseguin - Added, let me know what u think? |
||
will initalize the child components but not inject them into the DOM | ||
until the tab is activated. | ||
|
||
|
||
If the tab contains several complex child components or the tab's contents | ||
rely on DOM calculations during initialization, it is advised | ||
to lazy load the tab's content. | ||
|
||
Tab contents can be lazy loaded by declaring the body in a `ng-template` | ||
with the `matTabContent` attribute. | ||
|
||
```html | ||
<mat-tab-group> | ||
<mat-tab label="First"> | ||
<ng-template matTabContent> | ||
The First Content | ||
</ng-template> | ||
</mat-tab> | ||
<mat-tab label="Second"> | ||
<ng-template matTabContent> | ||
The Second Content | ||
</ng-template> | ||
</mat-tab> | ||
</mat-tab-group> | ||
``` | ||
|
||
### Accessibility | ||
Tabs without text or labels should be given a meaningful label via `aria-label` or | ||
`aria-labelledby`. For `MatTabNav`, the `<nav>` element should have a label as well. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would be neat to see a third tab that doesn't use lazy-loading so we can see the difference somehow (e.g. the content of Counter component should have the time it was loaded?)