/ / rozlišovač dynamických súčastí angular5 - uhlové, závislé vstrekovanie, uhlové5, uhlové aóty, uhlové6

angular5 dynamický komponentný resolver - uhlová, závislosť-vstrekovanie, angular5, angular-aot, angular6

Mám viac modulov, z ktorých každý obsahuje rôzne komponenty a rodičovský komponent, ktorý musí obsahovať jednu z týchto komponentov.

Pretože na to nemôžem použiť trasy, napísal som službu, ktorá dala a moduleName :string a a compomnentName : string vráti príslušnú triedu komponentov.

vidieť ComponentDirectoryService v tento stackblitz.

Napodobňujem, ako modul routeru umožňuje funkčným modulom vstrekovať svoje vlastné trasy:

  • ComponentDirectoryModuleforRoot a forChild metódy, ktorým a DIRECTORY_ENTRIES hodnota je odovzdaná
  • volá každý modul funkcie (p1 a p2 v stackblitz) forChild poskytnúť jeho DIRECTORY_ENTRIES
  • AppModule hovory forRoot ktorý stanovuje ComponentDirectoryService odovzdávanie kumulovaných (hovory na forChild) hodnota DIRECTORY_ENTRIES

Všetko funguje dobre v dev režime.

V produkčnom režime všetko funguje, ale dostávam toto strašidelné varovanie:

Nedajú sa vyriešiť všetky parametre pre ComponentDirectoryService v ... component-directory.service.ts: (?). Toto sa stane chybou v uhlovom v6.x

Čo ma zaujíma je to, že jediným parametrom služby sú položky adresára ...

EDIT 1

Rovnako ako Angular deklaruje token injekcie ROUTES:

export const ROUTES = new InjectionToken<Route[][]>("ROUTES");

tak urobím aj pre DIRECTORY_ENTRIES:

export const DIRECTORY_ENTRIES = new InjectionToken<ComponentDirectoryEntry[][]>("DIRECTORY_ENTRIES");

odpovede:

1 pre odpoveď č. 1

Kompilátorovi chýbajú informácie o tom, čo by sa malo do vašej služby skutočne vstreknúť.

Preto musíte výslovne používať @Inject(<YOUR_INJECTION_TOKEN>) dekoratérka na to poukázala:

constructor(@Inject(DIRECTORY_ENTRIES) private entries: ComponentDirectoryEntry[]) { }

Tým sa interne nastaví príznak metadát na vlastníctvo entries a pomocou týchto metadát bude Angular vedieť DIRECTORY_ENTRIES injekcia by sa tu mala podať.