当尝试在App组件(我们正在引导的组件)中使用Http时,一切正常:

export default class AppComponent {

  constructor(public http: Http){
    console.log(this.http);
  }

  getData() {

  }
}

bootstrap(AppComponent, [HTTP_PROVIDERS]);

但是,如果我用CustomHttpService包装Http(并且可能将CustomHttpService添加到bootstrap componenets数组中):

自定义http-service.ts:
export default class CustomHttpService {

  constructor(public http: Http){
    console.log(this.http);
  }

  getData() {

  }
}

app.ts :
bootstrap(AppComponent, [CustomehttpService]);

我越来越:
NoAnnotationError {message: "Cannot resolve all parameters for CustomHttpServic…ake sure they all have valid type or annotations.", stack: $
## _onError ##
TypeError: Cannot read property 'get' of undefined
    at angular2.dev.js:19620
    at Zone.run (angular2.dev.js:138)
    at Zone.run (angular2.dev.js:10644)
    at NgZone.run (angular2.dev.js:10607)
    at ApplicationRef_.bootstrap (angular2.dev.js:19615)
    at Object.commonBootstrap (angular2.dev.js:26650)
    at Object.bootstrap (angular2.dev.js:27475)
    at Object.<anonymous> (app.ts:23)
    at app.ts:23
    at SystemJSLoader.__exec (system.src.js:1384)
Uncaught TypeError: Cannot read property 'get' of undefined

我想念什么?仅导入模块并在引导功能中注册自定义服务还不够吗?

这个问题与我们想要注入到应用程序中的没有元数据的每个类(Component,View等)有关。

最佳答案

感谢Eric Martinez的注释和this awesome explanation,我可以看到当没有元数据附加到类(带有装饰器)时,打字稿类型是不够的。

本文提出的解决方案是将元数据添加到我们要注入的类中(在我的情况下为CustomHttpService),它将变为:

@Injectable() // from angluar2/core
export default class CustomHttpService {

  constructor(public http: Http){
    console.log(this.http);
  }

  getData() {

  }
}

并且当然要在bootstrap函数中将服务添加到injectables数组中:
bootstrap(AppComponent, [HTTP_PROVIDERS, CustomHttpService]);

现在可以了。

09-27 20:39