Почему бы не получить данные для вашего компонента из службы, чтобы вам не нужно было передавать их через токен внедрения MAT_DIALOG_DATA, а затем вы могли бы использовать свой компонент либо в полноэкранном режиме, либо в диалоговом режиме без необходимости использования оболочки. Убедитесь, что вы добавили его в список entryComponents вашего модуля, хотя
В противном случае ответ на ваш вопрос может быть таким: В диалоговом окне оболочки «AsDialogWrapperComponent»:
private createComponent(config: DialogConfig) {
this.destroyComponent();
const factory: ComponentFactory<DialogBase<any>> = this.resolver.resolveComponentFactory(config.component);
this.componentRef = this.container.createComponent(factory);
(this.componentRef.instance as DialogBase<any>).data = config.data;
(this.componentRef.instance as DialogBase<any>).close
.pipe(take(1))
.subscribe(this.closeDialog.bind(this));
this.cdRef.detectChanges();
}
private destroyComponent() {
this.container.clear();
if (this.componentRef) {
this.componentRef.destroy();
this.componentRef = null;
}
}
где вводится конфигурация в диалоговом окне оболочки:
constructor(@Inject(MAT_DIALOG_DATA) public data: DialogConfig) {}
и это выглядит так:
export interface DialogConfig {
component: { new(...args: any[]): any; };
data: any;
}
и DialogBase может быть классом, который расширяет ваш внутренний компонент:
import {
EventEmitter,
Output
} from '@angular/core';
export class DialogBase<T> {
@Output() close: EventEmitter<void> = new EventEmitter();
private _data: T;
constructor() {
}
set data(data: T) {
this._data = data;
}
get data(): T {
return this._data;
}
}
и T, интерфейс данных, ожидаемый вашим компонентом:
export class EditDialogComponent extends DialogBase<EditDialogData> {