Lazyload Angular Module из URL с одноэлементными сервисами - PullRequest
0 голосов
/ 24 июня 2019

Как лениво загружать угловые модули и предоставлять сервисы как синглтоны?

  • Приложение 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?
  • Любая альтернатива?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...