web-dev-qa-db-fra.com

Chargement du module dynamique depuis une autre url- angular4

Est-il possible de référencer un module (déjà compilé au format umd ou es) et de le charger dynamiquement dans une application angulaire déjà compilée?

  1. Application principale Shell hébergée à: http://plugin_Shell.mydomain.com
  2. Un module (avec un tas de composants, services, etc.): le code compilé est hébergé dans une autre URL. disons: http: //plugins/modules/myfirstplugin.umd.js
  3. Quand Shell se charge. Chargez tous les modules, rendez des composants spécifiques, reportez-vous aux services, utilisez la classe, etc.

J'ai essayé de charger le module avec SystemJsNgModuleLoader.load, mais cela semble fonctionner avec ce type de cas d'utilisation. 

Merci

EDIT: Même question (pas de réponse): Comment charger dynamiquement un module angulaire externe 2 (comme servi depuis un module externe.bundle.js)

7
ThePainnn

Vous pouvez le faire comme ça:

@Component({
  providers: [
    {
      provide: NgModuleFactoryLoader,
      useClass: SystemJsNgModuleLoader
    }
  ]
})
export class ModuleLoaderComponent {
  constructor(private _injector: Injector,
              private loader: NgModuleFactoryLoader) {
  }

  ngAfterViewInit() {
    this.loader.load('app/t.module#TModule').then((factory) => {
      const module = factory.create(this._injector);
      const r = module.componentFactoryResolver;
      const cmpFactory = r.resolveComponentFactory(AComponent);

      // create a component and attach it to the view
      const componentRef = cmpFactory.create(this._injector);
      this.container.insert(componentRef.hostView);
    })
  }
}

Lire Voici ce que vous devez savoir sur les composants dynamiques dans Angular pour plus de détails. Plus précisément Dynamic module loading and compilation section.