問題:
angularでルーティングされていないモジュールの遅延読み込みを設定しています。私が使用したバージョン7では、モジュールを遅延ロードし、モジュールへの最初のエントリポイントを取得するNgModuleFactoryLoader
機能です(アウトケースのサービス)load
this.loader.load('path-to-module')
.then(factory => {
const module = factory.create(this._injector);
return module.injector.get(EntryService);
});
しかし、Angular 8NgModuleFactoryLoader
では非推奨になっているため、代わりにその方法でモジュールをロードする必要があります。
import('path-to-module')
.then(m => m.MyModule)
.then(myModule => {
...
});
ここでの問題は、新しい遅延読み込み (IVY のアイデアの 1 つ - ファクトリがない) で、ファクトリを取得してプロバイダを取得できないことです。
私がすでに試したこと:
最初の解決策(製品にAOTコンパイラを使用しているため、私たちには適していないJITコンパイラでのみ機能します)
import('path-to-module')
.then(m => m.MyModule)
.then(myModule => {
return this._compiler.compileModuleAsync(myModule)
.then(factory => {
const module = factory.create(this._injector);
return module.injector.get(EntryService);
});
});
2番目の解決策(ダーティで完全にチェックされngInjectorDef
ていません。IVYの新機能を使用しており、まだ説明されているAPIはありません):
import('path-to-module')
.then(m => m.MyModule)
.then(myModule => {
const providers = myModule['ngInjectorDef'].providers; // Array<Providers>
... find EntryService in providers
});
ngInjectorDef
- angular によって追加され、ファクトリ、プロバイダー、およびインポートのプロパティを持つ静的モジュール クラス プロパティです。
ソース:
- https://netbasal.com/the-need-for-speed-lazy-load-non-routable-modules-in-angular-30c8f1c33093 (Angular 8 までのルーティング不可能なモジュールの遅延ロード)
- https://herringtondarkholme.github.io/2018/02/19/angular-ivy/ (IVY プレビュー - セクションを参照
No NgFactory file anymore
) - https://blog.angularindepth.com/automatically-upgrade-lazy-loaded-angular-modules-for-ivy-e760872e6084 (Angular < 8 と Angular 8 での遅延読み込みの違いについて説明します。重要なセクション - NgModule から NgModuleFactory へのAOTコンパイラ、基本的に私の問題は何ですか)