Skip to content

Commit 8ff9844

Browse files
crisbetommalerba
authored andcommitted
fix(cdk-experimental/column-resize): not working inside OnPush component (#19671)
Change detection wasn't triggered when attaching the resize handle inside an `OnPush` component which prevented some event listeners from being bound and broke the resizing completely. Fixes #19670.
1 parent 4ce635d commit 8ff9844

File tree

4 files changed

+24
-4
lines changed

4 files changed

+24
-4
lines changed

src/cdk-experimental/column-resize/resizable.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
OnDestroy,
1616
Type,
1717
ViewContainerRef,
18+
ChangeDetectorRef,
1819
} from '@angular/core';
1920
import {Directionality} from '@angular/cdk/bidi';
2021
import {ComponentPortal, PortalInjector} from '@angular/cdk/portal';
@@ -61,6 +62,7 @@ export abstract class Resizable<HandleComponent extends ResizeOverlayHandle>
6162
protected abstract readonly resizeNotifier: ColumnResizeNotifierSource;
6263
protected abstract readonly resizeStrategy: ResizeStrategy;
6364
protected abstract readonly viewContainerRef: ViewContainerRef;
65+
protected abstract readonly changeDetectorRef: ChangeDetectorRef;
6466

6567
/** The minimum width to allow the column to be sized to. */
6668
get minWidthPx(): number {
@@ -222,6 +224,9 @@ export abstract class Resizable<HandleComponent extends ResizeOverlayHandle>
222224
private _showHandleOverlay(): void {
223225
this._updateOverlayHandleHeight();
224226
this.overlayRef!.attach(this._createHandlePortal());
227+
228+
// Needed to ensure that all of the lifecycle hooks inside the overlay run immediately.
229+
this.changeDetectorRef.markForCheck();
225230
}
226231

227232
private _updateOverlayHandleHeight() {

src/material-experimental/column-resize/column-resize.spec.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
import {Component, Directive, ElementRef, Type, ViewChild} from '@angular/core';
2-
import {ComponentFixture, TestBed, fakeAsync, /*flush,*/ inject} from '@angular/core/testing';
1+
import {
2+
Component,
3+
Directive,
4+
ElementRef,
5+
Type,
6+
ViewChild,
7+
ChangeDetectionStrategy,
8+
} from '@angular/core';
9+
import {ComponentFixture, TestBed, fakeAsync, inject} from '@angular/core/testing';
310
import {BidiModule} from '@angular/cdk/bidi';
411
import {DataSource} from '@angular/cdk/collections';
512
import {dispatchKeyboardEvent} from '@angular/cdk/testing/private';
@@ -247,6 +254,9 @@ class MatResizeTest extends BaseTestComponent {
247254
@ViewChild(MatColumnResize, {static: true}) columnResize: AbstractMatColumnResize;
248255
}
249256

257+
@Component({template: getTableTemplate(false), changeDetection: ChangeDetectionStrategy.OnPush})
258+
class MatResizeOnPushTest extends MatResizeTest {}
259+
250260
@Component({template: getTableTemplate(true)})
251261
class MatResizeDefaultTest extends BaseTestComponent {
252262
@ViewChild(MatDefaultEnabledColumnResize, {static: true}) columnResize: AbstractMatColumnResize;
@@ -311,6 +321,7 @@ const approximateMatcher = {
311321

312322
const testCases: ReadonlyArray<[Type<object>, Type<BaseTestComponent>, string]> = [
313323
[MatColumnResizeModule, MatResizeTest, 'opt-in table-based mat-table'],
324+
[MatColumnResizeModule, MatResizeOnPushTest, 'inside OnPush component'],
314325
[MatColumnResizeModule, MatResizeFlexTest, 'opt-in flex-based mat-table'],
315326
[
316327
MatDefaultEnabledColumnResizeModule, MatResizeDefaultTest,

src/material-experimental/column-resize/resizable-directives/default-enabled-resizable.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
Injector,
1414
NgZone,
1515
ViewContainerRef,
16+
ChangeDetectorRef,
1617
} from '@angular/core';
1718
import {DOCUMENT} from '@angular/common';
1819
import {Directionality} from '@angular/cdk/bidi';
@@ -51,7 +52,8 @@ export class MatDefaultResizable extends AbstractMatResizable {
5152
protected readonly overlay: Overlay,
5253
protected readonly resizeNotifier: ColumnResizeNotifierSource,
5354
protected readonly resizeStrategy: ResizeStrategy,
54-
protected readonly viewContainerRef: ViewContainerRef) {
55+
protected readonly viewContainerRef: ViewContainerRef,
56+
protected readonly changeDetectorRef: ChangeDetectorRef) {
5557
super();
5658
this.document = document;
5759
}

src/material-experimental/column-resize/resizable-directives/resizable.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
Injector,
1414
NgZone,
1515
ViewContainerRef,
16+
ChangeDetectorRef,
1617
} from '@angular/core';
1718
import {DOCUMENT} from '@angular/common';
1819
import {Directionality} from '@angular/cdk/bidi';
@@ -50,7 +51,8 @@ export class MatResizable extends AbstractMatResizable {
5051
protected readonly overlay: Overlay,
5152
protected readonly resizeNotifier: ColumnResizeNotifierSource,
5253
protected readonly resizeStrategy: ResizeStrategy,
53-
protected readonly viewContainerRef: ViewContainerRef) {
54+
protected readonly viewContainerRef: ViewContainerRef,
55+
protected readonly changeDetectorRef: ChangeDetectorRef) {
5456
super();
5557
this.document = document;
5658
}

0 commit comments

Comments
 (0)