Skip to content

Commit 44e7313

Browse files
committed
fix(date-picker): markForCheck() on overlay events to prevent NG0100 in zoneless
1 parent 1edd7c1 commit 44e7313

2 files changed

Lines changed: 43 additions & 3 deletions

File tree

projects/igniteui-angular/date-picker/src/date-picker/date-picker.component.spec.ts

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
OverlayCancelableEventArgs, OverlayClosingEventArgs, OverlayEventArgs, OverlaySettings,
1414
WEEKDAYS
1515
} from 'igniteui-angular/core';
16-
import { ChangeDetectorRef, Component, DebugElement, ElementRef, EventEmitter, Injector, QueryList, Renderer2, ViewChild } from '@angular/core';
16+
import { ChangeDetectorRef, Component, DebugElement, ElementRef, EventEmitter, Injector, provideZonelessChangeDetection, QueryList, Renderer2, ViewChild } from '@angular/core';
1717
import { By } from '@angular/platform-browser';
1818
import { PickerCalendarOrientation, PickerHeaderOrientation, PickerInteractionMode } from '../../../core/src/date-common/types';
1919
import { DatePart } from '../../../core/src/date-common/public_api';
@@ -903,8 +903,8 @@ describe('IgxDatePicker', () => {
903903
get: mockNgControl
904904
});
905905

906-
mockCdr = jasmine.createSpyObj('ChangeDetectorRef', ['detectChanges']);
907-
mockCalendar = { selected: new EventEmitter<any>(), selectDate: () => {} };
906+
mockCdr = jasmine.createSpyObj('ChangeDetectorRef', ['detectChanges', 'markForCheck']);
907+
mockCalendar = { selected: new EventEmitter<any>(), selectDate: () => { } };
908908
const mockComponentInstance = {
909909
calendar: mockCalendar,
910910
todaySelection: new EventEmitter<any>(),
@@ -1665,6 +1665,44 @@ describe('IgxDatePicker', () => {
16651665
});
16661666
});
16671667
});
1668+
1669+
describe('Zoneless', () => {
1670+
let fixture: ComponentFixture<IgxDatePickerNgModelComponent>;
1671+
let datePicker: IgxDatePickerComponent;
1672+
1673+
beforeEach(async () => {
1674+
await TestBed.configureTestingModule({
1675+
imports: [
1676+
NoopAnimationsModule,
1677+
IgxDatePickerNgModelComponent,
1678+
],
1679+
providers: [
1680+
provideZonelessChangeDetection()
1681+
]
1682+
}).compileComponents();
1683+
1684+
fixture = TestBed.createComponent(IgxDatePickerNgModelComponent);
1685+
fixture.detectChanges();
1686+
});
1687+
1688+
it('should not throw ExpressionChangedAfterItHasBeenCheckedError when closing - issue #17305', fakeAsync(() => {
1689+
datePicker = fixture.componentInstance.datePicker;
1690+
1691+
datePicker.open();
1692+
fixture.detectChanges();
1693+
tick();
1694+
1695+
expect(() => {
1696+
datePicker.close();
1697+
fixture.detectChanges();
1698+
}).not.toThrow();
1699+
1700+
fixture.detectChanges();
1701+
tick(100);
1702+
const input = fixture.debugElement.query(By.css('input'));
1703+
expect(input.nativeElement.getAttribute('aria-expanded')).toBe('false');
1704+
}));
1705+
});
16681706
});
16691707
@Component({
16701708
template: `

projects/igniteui-angular/date-picker/src/date-picker/date-picker.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,7 @@ export class IgxDatePickerComponent extends PickerBaseDirective implements Contr
904904
this._initializeCalendarContainer(e.componentRef.instance);
905905
this._calendarContainer = e.componentRef.location.nativeElement;
906906
this._collapsed = false;
907+
this.cdr.markForCheck();
907908
});
908909

909910
this._overlayService.opened.pipe(...this._overlaySubFilter).subscribe(() => {
@@ -936,6 +937,7 @@ export class IgxDatePickerComponent extends PickerBaseDirective implements Contr
936937
this._overlayId = null;
937938
this._calendar = null;
938939
this._calendarContainer = undefined;
940+
this.cdr.markForCheck();
939941
});
940942
}
941943

0 commit comments

Comments
 (0)