Как лениво загружать угловые модули и предоставлять сервисы как синглтоны?
- Приложение lazyLoads ModA & ModB
- ModAComponent помещает некоторые данные в ModAService
- ModB получает данныеот ModAService
Но:
- Я не знаю ни одного из названий модулей
- У меня нет ни одного из модулей во время компиляции (они внешниемодули)
- Модули загружаются в папку кем угодно
- Мне нужно lazyLoad Modules с URL-адреса и использовать его
На основе https://itnext.io/how-to-build-a-plugin-extensible-application-architecture-in-angular5-736890278f3f
Загрузка модулей UMD с помощью SystemJS:
declare const SystemJS: any;
constructor(private compiler: Compiler,
private injector: Injector,
) {}
/**
* Get all file names (Modules) in system path (Backend)
*/
... for each Module found
SystemJS.import('/src/ModA.umd.js' & '/src/ModB.umd.js').then((moduleToCompile) => {
return this.compiler.compileModuleAsync(moduleToCompile['ModuleA' & 'ModuleB']);
}).then((modFac: NgModuleFactory<any>) => {
modFac.create(this.injector);
});
Загрузка компонента модуля в ViewChild (аналогично разделу 1):
this.compiler.compileModuleAndAllComponentsAsync<any>(modFac.moduleType)
.then((factory) => {
// Get needed component
const myFactory = factory.componentFactories.filter((component) => {
return component.componentType.name === 'MyComponent';
})[0];
this.MyViewChild.createComponent(actionsFactory);
});
После этого ModAComponent помещает некоторые данные в ModAService
Но ModB не видит никаких данных от ModAService
mod-loader.service.ts:16 Loading Module ModLazyAModule
18:58:36.065 app.component.ts:40 Waiting before importing LazyModuleB
18:58:36.068 core.js:16829 Angular is running in the development mode. Call enableProdMode() to enable the production mode.
18:58:36.146 mod-lazy-a.service.ts:11 ModLazyA Service constructor
18:58:36.147 mod-lazy-a.module.ts:13 ModLazyA Module constructor
18:58:36.147 mod-lazy-a.module.ts:15 Pushing data from ModLazyA Module constructor
18:58:36.147 mod-lazy-a.module.ts:17 data ["some Data from ModLazyA Module constructor"]
18:58:36.148 mod-lazy-a.component.ts:16 ModLazyA Component constructor
18:58:36.150 mod-lazy-a.component.ts:20 Pushing data from ModLazyA Component ngOnInit
18:58:36.150 mod-lazy-a.component.ts:22 data (2) ["some Data from ModLazyA Module constructor", "some Data from ModLazyA Component ngOnInit"]
18:58:37.640 mod-loader.service.ts:16 Loading Module ModLazyBModule
18:58:37.664 mod-lazy-a.service.ts:11 ModLazyA Service constructor
18:58:37.665 mod-lazy-b.module.ts:15 ModLazyB Module constructor
18:58:37.665 mod-lazy-b.module.ts:17 Getting data from ModLazyB Module constructor
18:58:37.665 mod-lazy-b.module.ts:18 data []
18:58:37.666 mod-lazy-b.component.ts:16 ModLazyB Component constructor
18:58:37.667 mod-lazy-b.component.ts:20 Getting data from ModLazyB Component constructor
18:58:37.667 mod-lazy-b.component.ts:21 data []
REPO: https://github.com/infnada/angularLazyTest
- Есть ли способ загрузить модули с открытыми сервисами, используя SystemJS в качестве одноэлементных сервисов?
- Есть ли способ загрузить модули из URL (например, внешнего) с помощью SystemJsNgModuleLoader?
- Любая альтернатива?
Спасибо!