簡體   English   中英

Angular 5 全局組件及其服務

[英]Angular 5 global components and their services

查看 Angular 的文檔,特別是樣式指南,他們列出了共享模塊和核心模塊。 根據文檔,服務應放置在核心模塊中,而組件應放置在共享模塊中。 我的問題是,如果我有一個組件,比如說自定義文件上傳組件,並且它也有相應的服務,那么該組件和服務應該駐留在何處? 由於服務與組件一起使用,因此將兩者保持在一起似乎很有意義,但是,這似乎並不遵循 Angular 標准。 有人遇到過這個問題嗎?

根據 Angular Style Guide,Angular 並不真正推薦在SharedModule提供服務。 原因是,無論哪個模塊導入SharedModule ,都將獲得該共享服務的單獨實例。 在有狀態服務的情況下,這實際上是不可接受的。 但是在您的情況下,我不確定該服務是否會包含任何狀態數據。 所以我認為,將這個 Component 和這個 Service 添加到 SharedModule 本身應該是安全的。

同樣,考慮到此服務不會有任何狀態數據。

此外,Angular 建議在CoreModule內提供服務,因為它還建議使CoreModule只能由單個模塊(通常是AppModule )導入。 這就是為什么它還建議創建一個 Guard以防止重新導入 CoreModule。

查找Providerssingleton-services 以通常的方式:

  • 如果你想要單例服務,你必須在根模塊中提供它,例如:路由器
  • 如果您需要每個組件實例的服務實例,那么您可以在組件定義中提供該服務,並且您可以將該服務實例傳遞給所有子組件:

    @Component({ /* . . . */ providers: [UserService] })

    在您的示例中:如果每個上傳組件都需要新的服務實例,則服務被定義為 @Injectable 類,導入到上傳組件源並在組件裝飾器提供者部分注冊為提供者。

這是一個很好的問題,我公司的同事經常問我這個問題。 正如您所說,官方文檔中的最佳實踐是讓CoreModuleSharedModule分別負責不同的問題。 大多數情況下,將您的服務放入“核心”並將組件/指令/管道等放入“共享”是有意義的。

但有時我們確實有例外並希望執行以下操作:

  1. SharedModule一項服務,用於管理對應組件/指令/管道狀態/配置/行為
  2. CoreModule中的一個組件,它只存在於根級別或在運行時動態創建。

對於場景 1,您可以為您的模塊使用傳統的forRoot()方法,以確保您的服務僅初始化一次。 另外值得一提的是,在 Angular 6 中,您可以使用新的provideIn: 'root'語法來簡化此目的。 你可以在網上找到很多資源。

對於場景 2,您通常將其放入entryComponents

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM