2016-10-13 37 views
4

有沒有辦法根據[email protected]中的環境變量條件地更改導入?我試圖以不需要更改代碼在客戶端代碼中導入服務的代碼方式,但是在需要時我可以指定一個構建標誌來交換模擬服務。angular-cli:使用環境變量的條件導入

有我試圖從this post使用模式:

文件結構:

MyService 
    MyServiceMock.ts 
    MyServiceReal.ts 
    index.ts 

而在你的index.ts,你可以有以下幾種:

import { environment} from '../environments/environment'; 

export const MyService = environment.mock ? 
    require('./MyServiceMock').MyServiceMock: 
    require('./MyServiceReal').MyServiceReal; 

而在你的客戶端代碼,進口爲MyService:

import MyService from './myservice/index'; 

該頁面加載,我可以看到的依賴逐步執行代碼時得到注入,但也有編譯錯誤(我相信是打字稿錯誤)沿着Cannot find name 'MyService'的線。

回答

7

你會對此完全錯誤的。角在配置providers

providers: [ 
    Any, 
    Dependencies 
    { 
    provide: MyService, 
    useFactory: (any: Any, dependencies: Dependencies) => { 
     if (environment.production) { 
     return new MyService(any, dependencies); 
     } else { 
     return new MockMyService(any, dependencies); 
     } 
    }, 
    deps: [ Any, Dependencies ] 
] 

可以處理這個用例與使用工廠現在你只需注入MyService隨處可見,因爲provide: MyService,但在發展,你會得到模擬,並在生產中你會得到真正的服務。

另請參見:

+2

這種方法運行良好,但有一個缺點,即模擬服務包含在生產包中 – ENargit

+0

如何在創建此提供程序時注入提供程序?通常我會從文件中導入服務,但在這種情況下,它可以是兩個文件中的一個。我如何知道Angular我想從提供的工廠函數中獲取提供者? – Valevalorin

+0

@Valevalorin通過令牌('provide'),它是'MyService'。這就是你注入的。 –

0

更改爲MyService進口:

import { MyService } from './myservice/index';

周圍的{}會告訴編譯器從文件中導入一個導出。如果你希望能夠進口,如:

import MyService from './myservice/index';

然後,你必須在index.ts e.g默認的導出:

export default MyService;

上打字稿模塊的詳細信息可以在這裏找到:https://www.typescriptlang.org/docs/handbook/modules.html

+0

感謝您的想法。我仍然遇到同樣的錯誤,'找不到名字'MyService''。另外值得注意的是:VS Code中的typescript的靜態分析反映了相同的錯誤,表示導入正在解析,但是當試圖在構造函數中進行依賴注入時,它不會解析名稱。 –