[英]Angular 5 global components and their services
查看 Angular 的文檔,特別是樣式指南,他們列出了共享模塊和核心模塊。 根據文檔,服務應放置在核心模塊中,而組件應放置在共享模塊中。 我的問題是,如果我有一個組件,比如說自定義文件上傳組件,並且它也有相應的服務,那么該組件和服務應該駐留在何處? 由於服務與組件一起使用,因此將兩者保持在一起似乎很有意義,但是,這似乎並不遵循 Angular 標准。 有人遇到過這個問題嗎?
根據 Angular Style Guide,Angular 並不真正推薦在SharedModule
提供服務。 原因是,無論哪個模塊導入SharedModule
,都將獲得該共享服務的單獨實例。 在有狀態服務的情況下,這實際上是不可接受的。 但是在您的情況下,我不確定該服務是否會包含任何狀態數據。 所以我認為,將這個 Component 和這個 Service 添加到 SharedModule 本身應該是安全的。
同樣,考慮到此服務不會有任何狀態數據。
此外,Angular 建議在CoreModule
內提供服務,因為它還建議使CoreModule
只能由單個模塊(通常是AppModule
)導入。 這就是為什么它還建議創建一個 Guard以防止重新導入 CoreModule。
查找Providers和singleton-services 。 以通常的方式:
如果您需要每個組件實例的服務實例,那么您可以在組件定義中提供該服務,並且您可以將該服務實例傳遞給所有子組件:
@Component({ /* . . . */ providers: [UserService] })
在您的示例中:如果每個上傳組件都需要新的服務實例,則服務被定義為 @Injectable 類,導入到上傳組件源並在組件裝飾器提供者部分注冊為提供者。
這是一個很好的問題,我公司的同事經常問我這個問題。 正如您所說,官方文檔中的最佳實踐是讓CoreModule
和SharedModule
分別負責不同的問題。 大多數情況下,將您的服務放入“核心”並將組件/指令/管道等放入“共享”是有意義的。
但有時我們確實有例外並希望執行以下操作:
SharedModule
一項服務,用於管理對應組件/指令/管道的狀態/配置/行為CoreModule
中的一個組件,它只存在於根級別或在運行時動態創建。 對於場景 1,您可以為您的模塊使用傳統的forRoot()
方法,以確保您的服務僅初始化一次。 另外值得一提的是,在 Angular 6 中,您可以使用新的provideIn: 'root'
語法來簡化此目的。 你可以在網上找到很多資源。
對於場景 2,您通常將其放入entryComponents
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.