当前位置:  开发笔记 > 编程语言 > 正文

Angular 2.0 - Injected Http服务未定义

如何解决《Angular2.0-InjectedHttp服务未定义》经验,为你挑选了0个好方法。

评论 - 我设法解决了这个问题,请参阅本文的底部

我正在使用UpgradeAdapter(ngUpgrade)升级我的Angular 1.X应用程序.我添加了一个新的Angular 2.0服务,我从我的Angular 2.0组件中调用它:

服务:

import {Inject} from 'angular2/core';
import {Http} from 'angular2/http';
import {Observable} from 'rxjs/Observable';

export default class MyService {
  _http;
  constructor(http: Http) {
    this._http = http; //http is undefined here
  }

  getData(): Observable {
    return this._http.get(someUrl);
  }
}

在我的内心我bootstrap.ts:

declare var angular: any;

import {UpgradeAdapter} from 'angular2/upgrade';
import {Http} from 'angular2/http';

let adapter = new UpgradeAdapter();

adapter.addProvider(Http);

//.....

adapter.bootstrap(document.body, ['myApp']);

我在这做错了什么?

编辑:

我正在向Angular 2.0服务注入另一项服务(Angular 1.X升级服务),它确实有效:

import {Inject} from 'angular2/core';
import {Http} from 'angular2/http';
import {Observable} from 'rxjs/Observable';

export default class MyService {
  _http;
  _dataService;
  constructor( @Inject('dataService') dataService, http: Http) {
    this._http = http; //http is undefined here
    this._dataService = dataService; //dataService is defined!!
  }

  getData(): Observable {
    return this._http.get(someUrl);
  }
}

Bootstrap.ts:

declare var angular: any;

import {UpgradeAdapter} from 'angular2/upgrade';
import {Http} from 'angular2/http';

let adapter = new UpgradeAdapter();

adapter.addProvider(Http);

adapter.upgradeNg1Provider('dataService');

adapter.bootstrap(document.body, ['myApp']);

编辑2:

在查看我的ES5传输代码时,我发现了以下代码:

 MyService = __decorate([
        core_1.Injectable(),
        __param(0, core_1.Inject('dataService'))
    ], MyService);
    return MyService;

正如你所看到的 - 没有http注射MyService.更改我的服务构造函数以使用此语法时

constructor( @Inject('dataService') dataService, @Inject('Http') http)

现在我收到以下错误:

Error: No provider for Http!

解决问题的方法:

所以我终于成功了,使用@PierreDuc回复的线索:

我将MyService的构造函数更改为:

constructor( @Inject('dataService') dataService, @Inject(Http) http)

HTTP_PROVIDERS作为提供者添加到我的组件(使用该服务):(在我的ng 2组件:)

providers: [MyService, HTTP_PROVIDERS]

不需要@InjectableaddProvider在我的引导程序内.

我不完全理解为什么会发生这种情况以及为什么这个解决方案有效.如果有人在这里知道,我们会很乐意解释它.

解决方案编辑

经过一番阅读,我现在更了解DI了.我可以使用addProvider(HTTP_PROVIDERS)而不是为每个组件定义一个提供程序(它将可用于所有组件).唯一的谜团是为什么注射private http: Http在工作时@Inject(Http) http不起作用.任何的想法???

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有