Skip to content

Commit f04596e

Browse files
authored
docs(material/sidenav): improve responsive example (#30227)
improvements: - use signal instead of manually detect changes - add access modifier to the class properties - add missing import of routerLink - replace deprecated add/removeListener with add/removeEventListener
1 parent af29a92 commit f04596e

File tree

2 files changed

+28
-17
lines changed

2 files changed

+28
-17
lines changed

src/components-examples/material/sidenav/sidenav-responsive/sidenav-responsive-example.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
@if (shouldRun) {
2-
<div class="example-container" [class.example-is-mobile]="mobileQuery.matches">
2+
<div class="example-container" [class.example-is-mobile]="isMobile()">
33
<mat-toolbar class="example-toolbar">
44
<button mat-icon-button (click)="snav.toggle()"><mat-icon>menu</mat-icon></button>
55
<h1 class="example-app-name">Responsive App</h1>
66
</mat-toolbar>
77

88
<mat-sidenav-container class="example-sidenav-container"
9-
[style.marginTop.px]="mobileQuery.matches ? 56 : 0">
10-
<mat-sidenav #snav [mode]="mobileQuery.matches ? 'over' : 'side'"
11-
[fixedInViewport]="mobileQuery.matches" fixedTopGap="56">
9+
[style.marginTop.px]="isMobile() ? 56 : 0">
10+
<mat-sidenav #snav [mode]="isMobile() ? 'over' : 'side'"
11+
[fixedInViewport]="isMobile()" fixedTopGap="56">
1212
<mat-nav-list>
1313
@for (nav of fillerNav; track nav) {
1414
<a mat-list-item routerLink=".">{{nav}}</a>
Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
import {MediaMatcher} from '@angular/cdk/layout';
2-
import {ChangeDetectorRef, Component, OnDestroy, inject} from '@angular/core';
2+
import {Component, OnDestroy, inject, signal} from '@angular/core';
33
import {MatListModule} from '@angular/material/list';
44
import {MatSidenavModule} from '@angular/material/sidenav';
55
import {MatIconModule} from '@angular/material/icon';
66
import {MatButtonModule} from '@angular/material/button';
77
import {MatToolbarModule} from '@angular/material/toolbar';
8+
import {RouterLink} from '@angular/router';
89

910
/** @title Responsive sidenav */
1011
@Component({
1112
selector: 'sidenav-responsive-example',
1213
templateUrl: 'sidenav-responsive-example.html',
1314
styleUrl: 'sidenav-responsive-example.css',
14-
imports: [MatToolbarModule, MatButtonModule, MatIconModule, MatSidenavModule, MatListModule],
15+
imports: [
16+
MatToolbarModule,
17+
MatButtonModule,
18+
MatIconModule,
19+
MatSidenavModule,
20+
MatListModule,
21+
RouterLink,
22+
],
1523
})
1624
export class SidenavResponsiveExample implements OnDestroy {
17-
mobileQuery: MediaQueryList;
25+
protected readonly fillerNav = Array.from({length: 50}, (_, i) => `Nav Item ${i + 1}`);
1826

19-
fillerNav = Array.from({length: 50}, (_, i) => `Nav Item ${i + 1}`);
20-
21-
fillerContent = Array.from(
27+
protected readonly fillerContent = Array.from(
2228
{length: 50},
2329
() =>
2430
`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
@@ -28,20 +34,25 @@ export class SidenavResponsiveExample implements OnDestroy {
2834
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`,
2935
);
3036

31-
private _mobileQueryListener: () => void;
37+
protected readonly isMobile = signal(true);
38+
39+
private readonly _mobileQuery: MediaQueryList;
40+
private readonly _mobileQueryListener: () => void;
3241

3342
constructor() {
34-
const changeDetectorRef = inject(ChangeDetectorRef);
3543
const media = inject(MediaMatcher);
3644

37-
this.mobileQuery = media.matchMedia('(max-width: 600px)');
38-
this._mobileQueryListener = () => changeDetectorRef.detectChanges();
39-
this.mobileQuery.addListener(this._mobileQueryListener);
45+
this._mobileQuery = media.matchMedia('(max-width: 600px)');
46+
this.isMobile.set(this._mobileQuery.matches);
47+
this._mobileQueryListener = () => this.isMobile.set(this._mobileQuery.matches);
48+
this._mobileQuery.addEventListener('change', this._mobileQueryListener);
4049
}
4150

4251
ngOnDestroy(): void {
43-
this.mobileQuery.removeListener(this._mobileQueryListener);
52+
this._mobileQuery.removeEventListener('change', this._mobileQueryListener);
4453
}
4554

46-
shouldRun = /(^|.)(stackblitz|webcontainer).(io|com)$/.test(window.location.host);
55+
protected readonly shouldRun = /(^|.)(stackblitz|webcontainer).(io|com)$/.test(
56+
window.location.host,
57+
);
4758
}

0 commit comments

Comments
 (0)