为什么我无法在@NgModule中导入Angular 2服务?

时间:2017-04-13 09:44:03

标签: javascript angular typescript

我有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

3 个答案:

答案 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所必需的。