Angular2没有服务提供者 - 外部模块

Posted

技术标签:

【中文标题】Angular2没有服务提供者 - 外部模块【英文标题】:Angular2 No provider for service - external module 【发布时间】:2017-07-21 22:22:53 【问题描述】:

我构建了一个 Angular Module,它拥有自己的服务和组件:

@NgModule(
  declarations: [ FileUploader],
  exports: [ FileUploader ],
  imports: [ CommonModule ],
  providers: [ FileService ],
)
export class FilesModule  

还有FileService

import  Injectable  from '@angular/core';

@Injectable()
export class FileService

    constructor() 

    uploadFile(file): Promise 
        return new Promise((resolve, reject) => 
            ...
        
    

然后我将它导入到我的AppModule:

@NgModule(
  declarations: [ AppComponent ],
  entryComponents: [ AppComponent ],
  imports: [ FilesModule ]
)
export class AppModule  

当我将FileService 注入AppComponent 时,我得到一个错误:

AppComponent 中的错误:没有 FileService 的提供程序

来自 Angular 文档:

当我们导入一个模块时,Angular 会将模块的服务提供者(其提供者列表的内容)添加到应用程序根注入器。

这使得应用程序中知道提供程序查找令牌的每个类都可以看到提供程序。

我缺少什么来完成这项工作?

【问题讨论】:

你在 app.module.ts 中导入 FileService 吗? 【参考方案1】:

当提供者在我的NgModule 中发挥作用时,我总是创建一个ForRoot 方法:

@NgModule(
  declarations: [FileUploader],
  exports: [FileUploader],
  imports: [CommonModule]
)
export class FilesModule 

  static forRoot(): ModuleWithProviders 
    return 
      ngModule: FilesModule,
      providers: [
        FileService
      ]
    
  

然后您可以在 AppModule 中使用它:

@NgModule(
  declarations: [AppComponent],
  entryComponents: [AppComponent],
  imports: [FilesModule.forRoot()]
)
export class AppModule 

【讨论】:

我添加了forRoot 方法,但仍然报错 并且您在 AppModule 导入中添加了 forRoot() 这正是我所做的 我从服务中删除了所有依赖项和功能 - 没有任何帮助 我创建了一个有效的plunkr。你能把你的版本和这个比较一下吗?看看有什么问题?或者自己创建一个 plunkr 来演示问题。可能是您没有使用正确的 IDE,在 AppComponent 的导入语句中导入 FileServiceFilesService 之间可能存在差异【参考方案2】:

我认为您尝试在 AppComponent 级别使用 FileService。如果您这样做,您应该将 FileService 添加到 AppModule 的提供程序或在 FileModule 级别使用 FileService。

您可能忘记了 FileService 中的 @Injectable() 注释

【讨论】:

我在FileModule 级别导入FileService,我没有忘记@Injectable() 就是这样!我有一个不同的文件仍在从AppModule 级别导入FileService - 我想知道为什么我得到AppComponent 中的错误 而不是那个文件。

以上是关于Angular2没有服务提供者 - 外部模块的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 RC5 ngModule:没有 NameService 的提供者

Angular 2:啥使服务成为“外部”角度区域?

将服务从 Angular2 重写为 Angular6 “模块‘AppModule’声明的意外模块‘HttpClientModule’

Angular2 模块级样式表

使用 Jasmine 间谍进行 Angular 2 组件测试“没有 Http 提供者!”错误

Angular 2 模块/应用程序结构