Angular报错:No provider for Http!MyService依赖注入问题求助
解决Angular中手动创建注入器时的"No provider for Http"错误
嘿,这个问题我太熟悉了!你遇到的错误根源在于:你手动创建的ReflectiveInjector是一个完全独立的根注入器,它不会自动继承AppModule里配置的任何提供者——哪怕你在AppModule里导入了HttpModule,也和这个手动创建的注入器没关系。
问题分析
MyService依赖Http,而Http本身又依赖XHRBackend和RequestOptions这些底层服务。当你用ReflectiveInjector.resolveAndCreate()创建注入器时,它只会使用你传入的数组里的提供者,默认不会包含Http及其依赖,所以才会抛出找不到Http提供者的错误。
解决方案
你需要把Http相关的提供者显式添加到注入器的配置数组里,有两种简单的方式:
方式1:直接导入HttpModule
HttpModule已经封装了Http及其所有依赖的提供者,直接把它加入注入器配置即可:
import { ReflectiveInjector } from '@angular/core'; import { HttpModule } from '@angular/http'; import { MyService } from './path-to-my-service'; const injector = ReflectiveInjector.resolveAndCreate([ HttpModule, // 加入HttpModule,它会提供Http、XHRBackend等依赖 MyService, { provide: 'name', useValue: 'abc' } ]);
方式2:显式添加Http及其依赖
如果你不想导入整个HttpModule,可以单独添加Http和它的依赖服务:
import { ReflectiveInjector } from '@angular/core'; import { Http, XHRBackend, RequestOptions } from '@angular/http'; import { MyService } from './path-to-my-service'; const injector = ReflectiveInjector.resolveAndCreate([ Http, XHRBackend, RequestOptions, MyService, { provide: 'name', useValue: 'abc' } ]);
额外建议:尽量遵循Angular的DI最佳实践
除非你有特殊场景需要手动创建注入器,否则更推荐通过AppModule的providers配置来提供MyService,这样Angular的默认注入器会自动处理所有依赖:
@NgModule({ imports: [HttpModule], providers: [ MyService, { provide: 'name', useValue: 'abc' } ] }) export class AppModule { }
之后你就可以在组件或其他服务里直接注入MyService,不需要手动创建注入器,更简洁也更符合Angular的设计理念。
内容的提问来源于stack exchange,提问作者user1765862
相关产品推荐
相关产品推荐

