javascript - Varför faller inte delad modulimport igenom?


Jag har en liten Angular-applikation som använder mönstret CoreModule och SharedModule. Eftersom min applikation är ganska liten just nu har jag importerat SharedModule i rotmodulen, AppModule. Jag har också en latent laddad admin-modul som heter AdminModule, men det verkar som att den inte har tillgång till shared-modulen även om den har importerats i rotmodulen. Jag måste explicit importera SharedModule igen för att kunna använda den inuti komponenterna i admin-modulen. Varför är det så? Om jag måste importera dem igen i varje latent laddad modul, vad är då poängen med att importera dem i rotmodulen?

AppModul

...
imports: [
    BrowserModule,
    BrowserAnimationsModule,
    MatExpansionModule,
    AppRoutingModule,
    AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule, // imports firebase/firestore, only needed for database features
    AngularFireAuthModule, // imports firebase/auth, only needed for auth features,
    AngularFireStorageModule, // imports firebase/storage only needed for storage features
    SharedModule, // To be imported on each feature module, instead of AppModule. For now, this is fine though
    CoreModule,
    HttpClientModule
  ],
...

App-routningsmodul (Lat laddad)

const routes: Routes = [
  {
    path: 'admin',
    loadChildren: './admin/admin.module#AdminModule',
    canActivate: [AdminAuthGuard]
  }]

AdminModul

...
imports: [CommonModule, AdminRoutingModule, SharedModule, CoreModule],

Ett exempel är om jag har en footer-komponent inuti SharedModule och försöker använda den i min AdminHomeComponent som är en del av AdminModule, får jag ett fel (utan att importera SharedModule). Allt fungerar bra när jag importerar det.

Svar #1

Att importera ett modul låter komponenterna i modulen som importerar den externa modulen, kunna se komponenterna från den importerade modulen. Men endast de i den modulen, inte i de inbäddade modulerna.

Att importera en modul i rotmodulen är användbart för PROVIDERS, det är ganska annorlunda från komponenter.

Om du importerar en modul som tillhandahåller en tjänst i en modul, kommer alla komponenter från den modulen och de inbäddade modulerna att kunna se leverantörerna. (detta är anledningen till varför det är en bra praxis att endast lägga modulens leverantörer i en statisk forRoot()-metod om modulen har leverantörer och komponenter som kommer att återanvändas).

Svar #2

Jag hittade också detta fantastiska svar på ett annat inlägg https://stackoverflow.com/a/43153529/8948458

I samma ögonblick som du skapar en ny modul, lat eller inte, varje ny modul och du deklarerar något i den, har den nya modulen ett rent tillstånd. Den har ingen kunskap om någonting,