Angular Injector error.e.getInjector().get() undefined. Куда то исчезает Injector
Основной метод открытия окна
public open<T>(type: ComponentRef<any>, modalParams: any = {}): Promise<T> {
this.preloaderService.showLoader$.next(false);
this.activeComponent = type.instance.constructor.name;
if (!SingleModalService.viewContainerRef) {
return Promise.reject('No view container');
} else {
SingleModalService.viewContainerRef.clear(); // закрывает предыдущее модальное окно
}
// создаем инстанс модалки
const container = this.createContainer(SingleModalWindowComponent) as ComponentRef<SingleModalContainer>;
const injector = Injector.create({
providers: [{ provide: SingleModalContext, deps: [] }],
parent: container.instance.container.injector,
});
const context = injector.get(SingleModalContext);
container.instance.context = context;
// Трейт/обертка для модального окна (расширяет его возможности)
if (container.instance.hasOwnProperty('params')) {
container.instance['params'] = modalParams;
}
if (container.instance.hasOwnProperty('destroy')) {
container.instance['destroy'].subscribe(status => {
this.activeComponent = null;
});
}
// вставляем в модальное окно инстанс встроенного компонента
container.instance.container.insert(type.hostView);
return context.promise(container, SingleModalService.viewContainerRef);
}
Вспомогательный метод, который принимает компонент для встраивания и открывает модальное окно
public open<T, D = any>(
component: Type<T>,
modalOptions: ModalOptionsInterface = {},
data?: D
): { close$: Observable<any>; instance: T } {
const injector =
data !== undefined
? Injector.create({ providers: [{ provide: MODAL_DATA, useValue: data }] })
: this.injector;
const modalComponent = this.componentFactoryResolver.resolveComponentFactory(component);
const componentRef = modalComponent.create(injector);
const close$ = new Subject();
this.singleModalService.open(componentRef, this.getModalOptions(modalOptions)).then(() => {
close$.next();
close$.complete();
});
return {
close$: close$.asObservable(),
instance: componentRef.instance,
};
}
