Я пытаюсь понять, как динамически загружать NgModule из пакета NPM, созданного путем создания проекта библиотеки Angular CLI, без того, чтобы модуль был известен приложению хоста во время компиляции.То, чего я хочу достичь, это следующее:
/* HOST APPLICATION */
// app.module.ts
export interface IPlugin {
path: string;
moduleName: string;
components: string[];
}
export function getPluginList(http: HttpClient) {
let ret: IPlugin[] = [];
ajax({ method: "GET", url: "*serverroot*/GetPluginList", async: false }).subscribe(list => ret = list.json());
return ret;
}
@NgModule({
[...],
providers: [{ provide: PLUGIN_LIST, useFactory: getPluginList, deps: [HttpClient] }]
})
export class AppModule {}
// plugin.service.ts
export class PluginService {
constructor(@Inject(PLUGIN_LIST) plugins: IPlugin[]) {}
getComponentFactory(component: string) {
const plugin = this.getComponentPlugin(component);
/* Load plugin dynamically (download the NgModule factory via HTTP) */
/* Grab its NgModume factory and extract the component factory */
}
}
// dashboard.component.ts
export class DashboardComponent {
constructor(private readonly pluginService: PluginService) {}
private loadWidget(widgetComponent: string): void {
const factory = this.pluginService.getComponentFactory(widgetComponent);
this.viewRef.create(factory);
}
}
Часть, которую я не могу в настоящее время достичь, это тело PluginService.getComponentFactory.Я много раз искал SO и нашел множество похожих вопросов, но все они предполагают, что вы хотите лениво загрузить фрагмент исходного кода, который есть в вашем проекте, или что по крайней мере путь к этим файлам кода известен, когдаВы создаете приложение.Таким образом, webpack возьмет эти пути и перепишет их внутри сгенерированного пакета, чтобы вы могли сделать this.loader.load, где this.loader - это тот же SystemJsNgModuleLoader, который находится внутри углового маршрутизатора.В моем случае я хочу загрузить модуль через HTTP-вызов, а не через сгенерированный веб-пакет требует вызова, и я понятия не имею, как это сделать ... Кто-нибудь может помочь?