2016-10-13 32 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的静态分析反映了相同的错误,表示导入正在解析,但是当试图在构造函数中进行依赖注入时,它不会解析名称。 –