我有ExchangeService
Angular 2 @Injectable
类,我有一个应用程序主模块:
@NgModule({
imports: [
BrowserModule,
HttpModule,
FormsModule,
ReactiveFormsModule,
ExchangeService,
RouterModule.forRoot(routes)
],
providers: [
{ provide: LocationStrategy,
useClass: HashLocationStrategy
},
ExchangeService
]
...})
引发异常
(index):16 Error: (SystemJS) Unexpected value 'ExchangeService' imported by the module 'Application5'
Error: Unexpected value 'ExchangeService' imported by the module 'Application5'
Error: (SystemJS) Unexpected value imported by the module Error: Unexpected value imported by the module
Error: Unexpected value imported by the module at eval (http://127.0.0.1:8080/node_modules/@angular/compiler/bundles/compiler.umd.js:13982:37) at Array.forEach (native) at CompileMetadataResolver.getNgModuleMetadata
Error: Unexpected value imported by the module at eval at Array.forEach (native) at CompileMetadataResolver.getNgModuleMetadata
当我从ExchangeService
子句中删除imports
时,异常消失(我留在providers
子句中)。我(目前)不明确需要ExchnageService
加入imports
条款(我不知道它有什么好处),我只想要ExchangeService
来可在全球组件的其他服务中注射。
问题是 - 为什么我不允许在ExchangeService
子句中写imports
? Imports
子句也包含其他TypeScript类 - 例如{{1等等以及为什么HttpModule
子句也不允许包含imports
?
答案 0 :(得分:5)
您应该导入内部提供商
从
中删除 imports: [
BrowserModule,
HttpModule,
FormsModule,
ReactiveFormsModule,
RouterModule.forRoot(routes)
]
导入:用于导入支持模块,如FormsModule,RouterModule,CommonModule或任何其他自定义功能模块。
阅读此what-is-difference-between-declarations-providers-and-import-in-ngmodule
答案 1 :(得分:3)
imports
,您可以在当前模块中使用其他(FormsModule,HttpModule等)模块。providers
可以注入组件,其他服务,管道等所需的服务。答案 2 :(得分:1)
imports
用于导入当前模块中的其他角度模块。
providers
用于告诉angular什么类型(实际上:实例)可用于依赖注入。
angular module
是组件,指令,管道,服务等的集合。它是一个抽象,有助于构建更大的项目并包含在其他地方编写的功能。
每个应用程序至少包含一个模块(在您的案例中为主模块)。当应用程序增长时,你会想要分成几个模块。
你的ExchangeService
可能不是一个模块,而只是一个服务(一个有一些方法的类)。应用程序的其他组件和服务可能依赖于ExchangeService的具体实例,如果将ExchangeService添加到providers数组,Angular将创建它的实例并在创建组件时将其作为依赖项注入(假设您将ExchangedService声明为组件构造函数的参数。)
我建议阅读https://angular.io/docs/ts/latest/guide/architecture.html。根据我的2美分,对这些建筑构建块的理解是成功使用Angular所必需的。