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,