Skip to content

Commit baa5191

Browse files
committed
fix(material/sidenav): resolve changed after checked error
Fixes a "changed after checked" error in the sidenav due to state in the container being dependent on state from the individual sidenavs.
1 parent 290e546 commit baa5191

File tree

4 files changed

+11
-72
lines changed

4 files changed

+11
-72
lines changed

src/material/sidenav/drawer.spec.ts

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,7 @@ import {
77
dispatchEvent,
88
dispatchKeyboardEvent,
99
} from '@angular/cdk/testing/private';
10-
import {
11-
Component,
12-
ElementRef,
13-
ErrorHandler,
14-
provideCheckNoChangesConfig,
15-
ViewChild,
16-
} from '@angular/core';
10+
import {Component, ElementRef, ErrorHandler, ViewChild} from '@angular/core';
1711
import {
1812
ComponentFixture,
1913
TestBed,
@@ -30,24 +24,7 @@ import {MATERIAL_ANIMATIONS} from '../core';
3024
describe('MatDrawer', () => {
3125
beforeEach(waitForAsync(() => {
3226
TestBed.configureTestingModule({
33-
providers: [
34-
{provide: MATERIAL_ANIMATIONS, useValue: {animationsDisabled: true}},
35-
provideCheckNoChangesConfig({exhaustive: false}),
36-
],
37-
imports: [
38-
MatSidenavModule,
39-
A11yModule,
40-
BasicTestApp,
41-
DrawerContainerNoDrawerTestApp,
42-
DrawerSetToOpenedFalse,
43-
DrawerSetToOpenedTrue,
44-
DrawerDynamicPosition,
45-
DrawerWithFocusableElements,
46-
DrawerOpenBinding,
47-
DrawerWithoutFocusableElements,
48-
IndirectDescendantDrawer,
49-
NestedDrawerContainers,
50-
],
27+
providers: [{provide: MATERIAL_ANIMATIONS, useValue: {animationsDisabled: true}}],
5128
});
5229
}));
5330

@@ -898,23 +875,6 @@ describe('MatDrawer', () => {
898875
});
899876

900877
describe('MatDrawerContainer', () => {
901-
beforeEach(waitForAsync(() => {
902-
TestBed.configureTestingModule({
903-
providers: [provideCheckNoChangesConfig({exhaustive: false})],
904-
imports: [
905-
MatSidenavModule,
906-
A11yModule,
907-
DrawerContainerTwoDrawerTestApp,
908-
DrawerDelayed,
909-
DrawerSetToOpenedTrue,
910-
DrawerContainerStateChangesTestApp,
911-
AutosizeDrawer,
912-
BasicTestApp,
913-
DrawerContainerWithContent,
914-
],
915-
});
916-
}));
917-
918878
it('should be able to open and close all drawers', fakeAsync(() => {
919879
const fixture = TestBed.createComponent(DrawerContainerTwoDrawerTestApp);
920880

@@ -1211,13 +1171,6 @@ describe('MatDrawerContainer', () => {
12111171
});
12121172
});
12131173

1214-
/** Test component that contains an MatDrawerContainer but no MatDrawer. */
1215-
@Component({
1216-
template: `<mat-drawer-container></mat-drawer-container>`,
1217-
imports: [MatSidenavModule, A11yModule],
1218-
})
1219-
class DrawerContainerNoDrawerTestApp {}
1220-
12211174
/** Test component that contains an MatDrawerContainer and 2 MatDrawer in the same position. */
12221175
@Component({
12231176
template: `

src/material/sidenav/drawer.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import {
4242
ViewChild,
4343
ViewEncapsulation,
4444
DOCUMENT,
45+
signal,
4546
} from '@angular/core';
4647
import {fromEvent, merge, Observable, Subject} from 'rxjs';
4748
import {debounceTime, filter, map, mapTo, startWith, take, takeUntil} from 'rxjs/operators';
@@ -273,12 +274,12 @@ export class MatDrawer implements AfterViewInit, OnDestroy {
273274
*/
274275
@Input()
275276
get opened(): boolean {
276-
return this._opened;
277+
return this._opened();
277278
}
278279
set opened(value: BooleanInput) {
279280
this.toggle(coerceBooleanProperty(value));
280281
}
281-
private _opened: boolean = false;
282+
private _opened = signal(false);
282283

283284
/** How the sidenav was opened (keypress, mouse click etc.) */
284285
private _openedVia: FocusOrigin | null;
@@ -385,7 +386,7 @@ export class MatDrawer implements AfterViewInit, OnDestroy {
385386
});
386387

387388
this._animationEnd.subscribe(() => {
388-
this.openedChange.emit(this._opened);
389+
this.openedChange.emit(this.opened);
389390
});
390391
}
391392

@@ -576,11 +577,11 @@ export class MatDrawer implements AfterViewInit, OnDestroy {
576577
restoreFocus: boolean,
577578
focusOrigin: Exclude<FocusOrigin, null>,
578579
): Promise<MatDrawerToggleResult> {
579-
if (isOpen === this._opened) {
580+
if (isOpen === this.opened) {
580581
return Promise.resolve(isOpen ? 'open' : 'close');
581582
}
582583

583-
this._opened = isOpen;
584+
this._opened.set(isOpen);
584585

585586
if (this._container?._transitionsEnabled) {
586587
// Note: it's importatnt to set this as early as possible,

src/material/sidenav/sidenav.spec.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
1-
import {Component, provideCheckNoChangesConfig, ViewChild} from '@angular/core';
2-
import {TestBed, fakeAsync, tick, waitForAsync} from '@angular/core/testing';
1+
import {Component, ViewChild} from '@angular/core';
2+
import {TestBed, fakeAsync, tick} from '@angular/core/testing';
33
import {By} from '@angular/platform-browser';
44
import {MatSidenav, MatSidenavContainer, MatSidenavModule} from './index';
55

66
describe('MatSidenav', () => {
7-
beforeEach(waitForAsync(() => {
8-
TestBed.configureTestingModule({
9-
providers: [provideCheckNoChangesConfig({exhaustive: false})],
10-
imports: [
11-
MatSidenavModule,
12-
SidenavWithFixedPosition,
13-
IndirectDescendantSidenav,
14-
NestedSidenavContainers,
15-
],
16-
});
17-
}));
18-
197
it('should be fixed position when in fixed mode', () => {
208
const fixture = TestBed.createComponent(SidenavWithFixedPosition);
219
fixture.detectChanges();

src/material/sidenav/testing/sidenav-harness.spec.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Component, provideCheckNoChangesConfig, signal} from '@angular/core';
1+
import {Component, signal} from '@angular/core';
22
import {ComponentFixture, TestBed} from '@angular/core/testing';
33
import {HarnessLoader, parallel} from '@angular/cdk/testing';
44
import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed';
@@ -16,9 +16,6 @@ describe('MatSidenavHarness', () => {
1616
let loader: HarnessLoader;
1717

1818
beforeEach(() => {
19-
TestBed.configureTestingModule({
20-
providers: [provideCheckNoChangesConfig({exhaustive: false})],
21-
});
2219
fixture = TestBed.createComponent(DrawerHarnessTest);
2320
fixture.detectChanges();
2421
loader = TestbedHarnessEnvironment.loader(fixture);

0 commit comments

Comments
 (0)