Skip to content

Commit afe98ee

Browse files
jnizetquentinderoubaix
authored andcommitted
fix(modal): mark for check after update of modal options
fix #4801
1 parent bfee86d commit afe98ee

File tree

3 files changed

+46
-38
lines changed

3 files changed

+46
-38
lines changed

src/modal/modal-backdrop.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
afterNextRender,
3+
ChangeDetectorRef,
34
Component,
45
ElementRef,
56
inject,
@@ -13,7 +14,10 @@ import {
1314
import { Observable } from 'rxjs';
1415

1516
import { ngbRunTransition } from '../util/transition/ngbTransition';
16-
import { reflow } from '../util/util';
17+
import { isDefined, reflow } from '../util/util';
18+
import { NgbModalUpdatableOptions } from './modal-config';
19+
20+
const BACKDROP_ATTRIBUTES: string[] = ['animation', 'backdropClass'];
1721

1822
@Component({
1923
selector: 'ngb-modal-backdrop',
@@ -30,6 +34,7 @@ export class NgbModalBackdrop implements OnInit {
3034
private _nativeElement = inject(ElementRef).nativeElement as HTMLElement;
3135
private _zone = inject(NgZone);
3236
private _injector = inject(Injector);
37+
private _cdRef = inject(ChangeDetectorRef);
3338

3439
@Input() animation: boolean;
3540
@Input() backdropClass: string;
@@ -60,4 +65,13 @@ export class NgbModalBackdrop implements OnInit {
6065
runningTransition: 'stop',
6166
});
6267
}
68+
69+
updateOptions(options: NgbModalUpdatableOptions) {
70+
BACKDROP_ATTRIBUTES.forEach((optionName: string) => {
71+
if (isDefined(options[optionName])) {
72+
this[optionName] = options[optionName];
73+
}
74+
});
75+
this._cdRef.markForCheck();
76+
}
6377
}

src/modal/modal-ref.ts

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import { takeUntil } from 'rxjs/operators';
55

66
import { NgbModalBackdrop } from './modal-backdrop';
77
import { NgbModalWindow } from './modal-window';
8-
import { NgbModalOptions, NgbModalUpdatableOptions } from './modal-config';
9-
import { isDefined } from '../util/util';
8+
import { NgbModalUpdatableOptions } from './modal-config';
109

1110
import { ContentRef } from '../util/popup';
1211
import { isPromise } from '../util/util';
@@ -39,22 +38,6 @@ export class NgbActiveModal {
3938
dismiss(reason?: any): void {}
4039
}
4140

42-
const WINDOW_ATTRIBUTES: string[] = [
43-
'animation',
44-
'ariaLabelledBy',
45-
'ariaDescribedBy',
46-
'backdrop',
47-
'centered',
48-
'fullscreen',
49-
'keyboard',
50-
'role',
51-
'scrollable',
52-
'size',
53-
'windowClass',
54-
'modalDialogClass',
55-
];
56-
const BACKDROP_ATTRIBUTES: string[] = ['animation', 'backdropClass'];
57-
5841
/**
5942
* A reference to the newly opened modal returned by the `NgbModal.open()` method.
6043
*/
@@ -65,31 +48,15 @@ export class NgbModalRef {
6548
private _resolve: (result?: any) => void;
6649
private _reject: (reason?: any) => void;
6750

68-
private _applyWindowOptions(windowInstance: NgbModalWindow, options: NgbModalOptions): void {
69-
WINDOW_ATTRIBUTES.forEach((optionName: string) => {
70-
if (isDefined(options[optionName])) {
71-
windowInstance[optionName] = options[optionName];
72-
}
73-
});
74-
}
75-
76-
private _applyBackdropOptions(backdropInstance: NgbModalBackdrop, options: NgbModalOptions): void {
77-
BACKDROP_ATTRIBUTES.forEach((optionName: string) => {
78-
if (isDefined(options[optionName])) {
79-
backdropInstance[optionName] = options[optionName];
80-
}
81-
});
82-
}
83-
8451
/**
8552
* Updates options of an opened modal.
8653
*
8754
* @since 14.2.0
8855
*/
8956
update(options: NgbModalUpdatableOptions): void {
90-
this._applyWindowOptions(this._windowCmptRef.instance, options);
57+
this._windowCmptRef.instance.updateOptions(options);
9158
if (this._backdropCmptRef && this._backdropCmptRef.instance) {
92-
this._applyBackdropOptions(this._backdropCmptRef.instance, options);
59+
this._backdropCmptRef.instance.updateOptions(options);
9360
}
9461
}
9562

src/modal/modal-window.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { DOCUMENT } from '@angular/common';
22
import {
33
afterNextRender,
4+
ChangeDetectorRef,
45
Component,
56
ElementRef,
67
EventEmitter,
@@ -21,7 +22,23 @@ import { filter, switchMap, take, takeUntil, tap } from 'rxjs/operators';
2122
import { getFocusableBoundaryElements } from '../util/focus-trap';
2223
import { ModalDismissReasons } from './modal-dismiss-reasons';
2324
import { ngbRunTransition, NgbTransitionOptions } from '../util/transition/ngbTransition';
24-
import { isString, reflow } from '../util/util';
25+
import { isDefined, isString, reflow } from '../util/util';
26+
import { NgbModalUpdatableOptions } from './modal-config';
27+
28+
const WINDOW_ATTRIBUTES: string[] = [
29+
'animation',
30+
'ariaLabelledBy',
31+
'ariaDescribedBy',
32+
'backdrop',
33+
'centered',
34+
'fullscreen',
35+
'keyboard',
36+
'role',
37+
'scrollable',
38+
'size',
39+
'windowClass',
40+
'modalDialogClass',
41+
] as const;
2542

2643
@Component({
2744
selector: 'ngb-modal-window',
@@ -58,6 +75,7 @@ export class NgbModalWindow implements OnInit, OnDestroy {
5875
private _elRef = inject(ElementRef<HTMLElement>);
5976
private _zone = inject(NgZone);
6077
private _injector = inject(Injector);
78+
private _cdRef = inject(ChangeDetectorRef);
6179

6280
private _closed$ = new Subject<void>();
6381
private _elWithFocus: Element | null = null; // element that is focused prior to modal opening
@@ -127,6 +145,15 @@ export class NgbModalWindow implements OnInit, OnDestroy {
127145
return transitions$;
128146
}
129147

148+
updateOptions(options: NgbModalUpdatableOptions): void {
149+
WINDOW_ATTRIBUTES.forEach((optionName: string) => {
150+
if (isDefined(options[optionName])) {
151+
this[optionName] = options[optionName];
152+
}
153+
});
154+
this._cdRef.markForCheck();
155+
}
156+
130157
private _show() {
131158
const context: NgbTransitionOptions<any> = { animation: this.animation, runningTransition: 'continue' };
132159

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy