diff --git a/packages/devextreme-angular/src/ui/popup/index.ts b/packages/devextreme-angular/src/ui/popup/index.ts
index 8c2d357bcff4..9357376a9b3b 100644
--- a/packages/devextreme-angular/src/ui/popup/index.ts
+++ b/packages/devextreme-angular/src/ui/popup/index.ts
@@ -1,2 +1,2 @@
export * from './component';
-export { DxPopupService } from './service/service';
+export { DxPopupService, DxPopupServiceComponent } from './service/service';
diff --git a/packages/devextreme-angular/src/ui/popup/service/service.component.ts b/packages/devextreme-angular/src/ui/popup/service/service.component.ts
index 5c789f078a40..1affb5b9a36e 100644
--- a/packages/devextreme-angular/src/ui/popup/service/service.component.ts
+++ b/packages/devextreme-angular/src/ui/popup/service/service.component.ts
@@ -2,10 +2,10 @@ import {
AfterViewInit,
Component, ComponentRef,
ElementRef,
- EventEmitter, Inject,
+ Inject,
NgZone,
- Output, PLATFORM_ID,
- TransferState,
+ PLATFORM_ID,
+ TransferState, Type,
ViewChild,
} from '@angular/core';
import {
@@ -14,7 +14,7 @@ import {
NestedOptionHost,
WatcherHelper,
} from 'devextreme-angular/core';
-import { DxPopupComponent } from '../component';
+import { DxPopupComponent, DxPopupTypes } from '../component';
import { DxServicePopupInsertionDirective } from './insertion.directive';
@Component({
@@ -28,28 +28,33 @@ import { DxServicePopupInsertionDirective } from './insertion.directive';
],
template: '',
})
-export class DxServicePopupComponent extends DxPopupComponent implements AfterViewInit {
+export class PopupServiceComponent extends DxPopupComponent implements AfterViewInit {
@ViewChild(DxServicePopupInsertionDirective) contentInsertion: DxServicePopupInsertionDirective;
- @Output() afterViewInit$: EventEmitter = new EventEmitter();
-
- contentRef: ComponentRef;
+ contentRef: ComponentRef;
constructor(
- elementRef: ElementRef,
- ngZone: NgZone,
- templateHost: DxTemplateHost,
- _watcherHelper: WatcherHelper,
- _idh: IterableDifferHelper,
- optionHost: NestedOptionHost,
- transferState: TransferState,
- @Inject(PLATFORM_ID) platformId: any,
+ @Inject('popupServiceContentComponent') private contentComponent: Type,
+ @Inject('popupServiceOptions') private popupOptions: DxPopupTypes.Properties,
+ elementRef: ElementRef,
+ ngZone: NgZone,
+ templateHost: DxTemplateHost,
+ _watcherHelper: WatcherHelper,
+ _idh: IterableDifferHelper,
+ optionHost: NestedOptionHost,
+ transferState: TransferState,
+ @Inject(PLATFORM_ID) platformId: any,
) {
super(elementRef, ngZone, templateHost, _watcherHelper, _idh, optionHost, transferState, platformId);
}
ngAfterViewInit() {
super.ngAfterViewInit();
- this.afterViewInit$.emit();
+
+ if(this.popupOptions) {
+ this.instance.option(this.popupOptions)
+ }
+
+ this.contentRef = this.contentInsertion?.viewContainerRef.createComponent(this.contentComponent);
}
}
diff --git a/packages/devextreme-angular/src/ui/popup/service/service.ts b/packages/devextreme-angular/src/ui/popup/service/service.ts
index 66defe45bb41..3188cc058e27 100644
--- a/packages/devextreme-angular/src/ui/popup/service/service.ts
+++ b/packages/devextreme-angular/src/ui/popup/service/service.ts
@@ -6,8 +6,10 @@ import {
EmbeddedViewRef,
ComponentRef, Type,
} from '@angular/core';
-import { DxPopupTypes } from '../component';
-import { DxServicePopupComponent } from './service.component';
+import { DxPopupComponent, DxPopupTypes } from '../component';
+import { PopupServiceComponent } from './service.component';
+
+export type DxPopupServiceComponent = DxPopupComponent & { contentRef: ComponentRef }
@Injectable({
providedIn: 'root',
@@ -19,22 +21,22 @@ export class DxPopupService {
private readonly componentFactoryResolver: ComponentFactoryResolver,
) {}
- open(contentComponent: Type, popupOptions?: DxPopupTypes.Properties) {
- const componentFactory = this.componentFactoryResolver.resolveComponentFactory(DxServicePopupComponent);
- const componentRef: ComponentRef = componentFactory.create(this.injector);
+ open(contentComponent: Type, popupOptions?: DxPopupTypes.Properties): DxPopupServiceComponent {
+ const componentFactory = this.componentFactoryResolver.resolveComponentFactory(PopupServiceComponent);
+ const serviceInjector = Injector.create({
+ providers: [
+ { provide: 'popupServiceContentComponent', useValue: contentComponent },
+ { provide: 'popupServiceOptions', useValue: popupOptions },
+ ],
+ parent: this.injector
+ });
+ const componentRef = componentFactory.create(serviceInjector);
const cmpInstance = componentRef.instance;
cmpInstance.onHidden.subscribe(() => {
this.applicationRef.detachView(componentRef.hostView);
- componentRef.destroy();
- });
-
- cmpInstance.afterViewInit$.subscribe(() => {
- if (popupOptions) {
- cmpInstance.instance.option(popupOptions);
- }
- componentRef.instance.contentRef = cmpInstance.contentInsertion?.viewContainerRef.createComponent(contentComponent);
+ componentRef.destroy();
});
this.applicationRef.attachView(componentRef.hostView);
@@ -47,6 +49,6 @@ export class DxPopupService {
this.applicationRef.tick();
- return componentRef.instance as (typeof componentRef.instance & { contentRef: ComponentRef });
+ return componentRef.instance;
}
}