Commit 4a8c9428 authored by Ilya Surmay's avatar Ilya Surmay
Browse files

fix(modal): fix modal behavior in lazy loaded modules, allow import without...

fix(modal): fix modal behavior in lazy loaded modules, allow import without .forRoot() in child modules
parent d658460e
Showing with 50 additions and 16 deletions
+50 -16
......@@ -16,6 +16,7 @@ import {
TRANSITION_DURATIONS
} from './modal-options.class';
import { BsModalRef } from './bs-modal-ref.service';
import { BsModalStore } from './bs-modal.store';
@Injectable()
export class BsModalService {
......@@ -25,9 +26,24 @@ export class BsModalService {
onShown: EventEmitter<any> = new EventEmitter();
onHide: EventEmitter<any> = new EventEmitter();
onHidden: EventEmitter<any> = new EventEmitter();
modalsCount = 0;
lastDismissReason = '';
loaders: ComponentLoader<ModalContainerComponent>[] = [];
get modalsCount(): number {
return this.store.modalsCount;
}
set modalsCount(count) {
this.store.modalsCount = count;
}
get lastDismissReason(): any {
return this.store.lastDismissReason;
}
set lastDismissReason(reason: any) {
this.store.lastDismissReason = reason;
}
get loaders(): any {
return this.store.loaders;
}
protected isBodyOverflowing = false;
protected originalBodyPadding = 0;
......@@ -37,7 +53,7 @@ export class BsModalService {
private _backdropLoader: ComponentLoader<ModalBackdropComponent>;
private _renderer: Renderer2;
constructor(rendererFactory: RendererFactory2, private clf: ComponentLoaderFactory) {
constructor(rendererFactory: RendererFactory2, private clf: ComponentLoaderFactory, private store: BsModalStore) {
this._backdropLoader = this.clf.createLoader<ModalBackdropComponent>(
null,
null,
......@@ -72,7 +88,7 @@ export class BsModalService {
this.modalsCount = this.modalsCount >= 1 ? this.modalsCount - 1 : 0;
setTimeout(() => {
this._hideModal(level);
this.removeLoaders(level);
this.store.removeLoaders(level);
}, this.config.animated ? TRANSITION_DURATIONS.BACKDROP : 0);
}
......@@ -179,15 +195,6 @@ export class BsModalService {
return loader;
}
private removeLoaders(level: number): void {
this.loaders.splice(level - 1, 1);
this.loaders.forEach(
(loader: ComponentLoader<ModalContainerComponent>, i: number) => {
loader.instance.level = i + 1;
}
);
}
private copyEvent(from: EventEmitter<any>, to: EventEmitter<any>) {
from.subscribe(() => {
to.emit(this.lastDismissReason);
......
import { Injectable } from '@angular/core';
import { ComponentLoader } from '../component-loader/component-loader.class';
import { ModalContainerComponent } from './modal-container.component';
@Injectable()
export class BsModalStore {
modalsCount = 0;
lastDismissReason = '';
loaders: ComponentLoader<ModalContainerComponent>[] = [];
getModalsCount(): number {
return this.modalsCount;
}
setDismissReason(reason: any): void {
this.lastDismissReason = reason;
}
removeLoaders(level: number): void {
this.loaders.splice(level - 1, 1);
this.loaders.forEach(
(loader: ComponentLoader<ModalContainerComponent>, i: number) => {
loader.instance.level = i + 1;
}
);
}
}
......@@ -6,6 +6,7 @@ import { PositioningService } from '../positioning';
import { ComponentLoaderFactory } from '../component-loader';
import { ModalContainerComponent } from './modal-container.component';
import { BsModalService } from './bs-modal.service';
import { BsModalStore } from './bs-modal.store';
@NgModule({
declarations: [
......@@ -14,13 +15,14 @@ import { BsModalService } from './bs-modal.service';
ModalContainerComponent
],
exports: [ModalBackdropComponent, ModalDirective],
entryComponents: [ModalBackdropComponent, ModalContainerComponent]
entryComponents: [ModalBackdropComponent, ModalContainerComponent],
providers: [BsModalService, ComponentLoaderFactory]
})
export class ModalModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: ModalModule,
providers: [BsModalService, ComponentLoaderFactory, PositioningService]
providers: [BsModalStore, PositioningService]
};
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment