nasıl

2016-09-23 4 views
43

Herkes ben .forRoot ile birden iç içe özellik modülleri hiyerarşi yapısı nasıl bana aydınlatabilir misiniz özellik modülleri hiyerarşi içinde .forRoot() kullanmak() çağrıları? Örneğinnasıl

ne böyle modülleri varsa:

- MainModule 
- SharedModule 
- FeatureModuleA 
    - FeatureModuleA1 
    - FeatureModuleA2 
- FeatureModuleB 

Tüm özellik modüllerini bir .forRoot() statik işlevi vardır.

Bir şekilde ".forRoot() işlevlerini" aktarma "ile FeatureModuleA nasıl tanımlamalıyım?) FeatureModuleA işlevini

@NgModule({ 
    imports: [ 
    //- I can use .forRoot() calls here but this module not the root module 
    //- I don't need to import sub-modules here, FeatureA only a wrapper 
    //FeatureModuleA1.forRoot(), //WRONG! 
    //FeatureModuleA2.forRoot(), //WRONG! 
    ], 
    exports: [ 
    //I cannot use .forRoot() calls here 
    FeatureModuleA1, 
    FeatureModuleA2 
    ] 
}) 
class FeatureModuleA { 
    static forRoot(): ModuleWithProviders { 
    return { 
     //At this point I can set any other class than FeatureModuleA for root 
     //So lets create a FeatureRootModuleA class: see below! 
     ngModule: FeatureModuleA //should be: FeatureRootModuleA 
    }; 
    } 
} 

Sonra kök kullanımı için başka bir sınıf oluşturabilir (forRoot içinde ayarlayın:

@NgModule({ 
    imports: [ 
    //Still don't need any sub module within this feature module 
    ] 
    exports: [ 
    //Still cannot use .forRoot() calls but still need to export them for root module too: 
    FeatureModuleA1, 
    FeatureModuleA2 
    ] 
}) 
class FeatureRootModuleA { } 

Ama yapabilirim "transferi" .forRoot() bu dahilinde çağrıları nasıl özel ModuleClass?

ben her orada için .forRoot() benim kök MainModule doğrudan tüm alt modülleri almak ve çağırmanız gerekir Görüldüğü üzere:

@NgModule({ 
    imports: [ 
    FeatureModuleA1.forRoot(), 
    FeatureModuleA2.forRoot(), 
    FeatureModuleA.forRoot(), 
    SharedModule.forRoot() 
    ] 
}) 
class MainModule { } 

Haklı mıyım? Cevap vermeden önce bu dosyanın bir göz atın lütfen: https://github.com/angular/material2/blob/master/src/lib/module.ts

Ben resmi açısal ekip tarafından tutulan bu repo bildiği gibi. Bu yüzden yukarıdakileri özel bir MaterialRootModule modülünde tüm .forRoot() çağrılarını içe aktararak çözüyorlar. Kendi kök modülüm için nasıl uygulanacağını anlamıyorum. kök ve .forRoot gerçekten burada demek neyi? Bu, gerçek web projesine değil, pakete göre mi? Genellikle forRoot

+0

genelde aktarılmış olması gerekirken bu nedenle

, biz, yöntem yalnızca kök (uygulama) modülü çağrısında gerektiğini belirtmek için bir (Kongre tarafından) forRoot yöntemi ekleyin bir 'forRoot' yöntemi oluşturmak ve kullanmak istediğiniz neden emin değilim .. belki bu yardımcı olur: https://angular.io/docs/ts/latest/guide/ngmodule.html – mxii

+1

Evet. Resmi belgeleri okudum. Birden çok yuvalanmış modülle karmaşık projelerin nasıl kesileceği konusunda hiçbir şey yoktur. ForRoot'u tam olarak oluşturmak ve kullanmak istiyorum çünkü sağlayıcı singletonları tüm proje içinde yalnızca bir kez gösterilmeli. – ggabor

+0

Tamam, örnekte hiç sağlayıcı yok. :) – mxii

cevap

79

uygulama/tekil hizmetleri eklemek için kullanılır.

@NgModule({ 
    providers: [ /* DONT ADD HERE */ ] 
}) 
class SharedModule { 
    static forRoot() { 
    return { 
     ngModule: SharedModule, 
     providers: [ AuthService ] 
    } 
    } 
} 

muhakeme Eğer @NgModule yılında providers için AuthService eklerseniz, birden fazla diğer modüllere SharedModule içe eğer oluşturulacak mümkün olmasıdır.

Hizmetin SharedModule bir heyecanla yüklü modülüne aktarılır oluşturulan edilip edilmeyeceğinden% 100 net değilim, ama dokümanlar bahsettiği açıklama tembel modülleri yüklenen açısından oldu. Bir modülü yavaşça yüklediğinizde, tüm sağlayıcılar oluşturulur. Diğer modülü için sadece

@NgModule({ 
    imports: [SharedModule] 
}) 
class FeatureModule {} 

@NgModule({ 
    imports: [SharedModule.forRoot()] 
}) 
class AppModule {} 
+0

Çabalarınız için teşekkür ederiz, ancak bu çok katlı yuvalanmış modül durumunu umursamıyor. Örneğinizde, AuthService'ı SharedModule'a aktardınız. Lütfen örneği SharedModule (hizmet yerine modül yerine) alarak yeniden örneklendirebilir ve AuthModule.forRoot() yöntemini bir yerlerde kullanmayı deneyebilirsiniz. (feragatname: benim için AuthService/AuthModule sadece bir örnek - forChild ve forRoot yöntemleri ile herhangi bir modül olabilir.) – ggabor

+3

forRoot sadece uygulama modülü için kullanılmalıdır. Bir şey iletmeye gerek yok. Sadece SharedModule forRoot olmadan içe aktardığınızda, forRoot hiçbir zaman aranmaz. Modüllerimizi bu şekilde yapılandırmalıyız. ForRoot'taki uygulama servisleri ve NgModule'deki diğer her şey. İç içe geçmiş olsun ya da olmasın, bu şekilde düşünmelisiniz –

+0

Özellik modülünü diğer özellik modüllerine aktarmanız gerekiyorsa, devam etmeyin, bu zarar vermez. Sadece forRoot içinde uygulama genel sağlayıcıları hakkında başparmak kuralını hatırlayın ve iyi olmalısınız –