【问题标题】:Angular2 component unable to receive a service in constructorAngular2组件无法在构造函数中接收服务
【发布时间】:2017-03-22 22:28:13
【问题描述】:

我有一个服务定义如下。

import { Injectable } from "@angular/core";
import { Http } from "@angular/http";

@Injectable()
export class SirService {
  constructor(private http: Http) {
    console.log("The http is: " + http);
  }

  stuff() { return ["uno", "duo", "tress"]; }
}

然后,我将组件的提供者设置为这样的服务。

import { Component } from "@angular/core";
import { SirService } from "../app.service";

@Component({
  selector: "demo",
  providers: [SirService],
  template: require("./demo.html"),
  styles: [require("./common.scss")]
})
export class Demo {
  // constructor() {
  constructor(private service: SirService) {
    console.log("Service: " + service);
  }
}

不过,我不确定如何访问服务中的stuff() 调用。上面产生的错误告诉我 Angular 找不到任何有意义的东西来推入我的构造函数。当我使用无参数构造函数时,我没有对服务的引用。有点卡在那里,似乎很少有例子展示如何为组件而不是模块执行此操作......(我可能在谷歌上愚蠢地搜索......)

错误消息很庞大,但这是最相关的部分(据我所知)。

未处理的 Promise 拒绝:没有 Http 提供者! ;区域:角度;任务:Promise.then;值:

【问题讨论】:

  • 当您询问错误时,请发布错误。完整而准确的错误。
  • @JBNizet 我没有问这样的错误,因为与资源相比,语法应该是正确的,但我同意它可能有用。请在 5 分钟内查看编辑。谢谢指点。
  • @JBNizet 已发布。它的全部内容太大而无法显示,但编辑显示了有趣的部分。

标签: angular typescript


【解决方案1】:

错误是

No provider for Http

这意味着问题不在于您的服务。问题是你的服务需要使用Http服务,而这个服务不存在。

需要导入提供该服务的HttpModule:

@NgModule({
  // ...
  imports: [BrowserModule, ..., HttpModule]
})
export class AppModule {}

更多解释在the documentation

【讨论】:

  • 啊哈!所以没有办法将服务类和组件划分为唯一知道HttpModule的组件?我必须把它放在我的模块装饰器的导入部分吗?我的意思是,毕竟我确实将它导入到服务导入中(第 2 行)。
  • 是的。您的服务,因为它是完全无状态的,也可以由根模块提供:为您的组件的每个实例创建一个新实例没有真正意义。你可以为这个组件和这个服务创建一个子模块,但我真的不明白这一点。无论如何,你都会在任何地方使用 Http。
  • 有趣的地方。我明白了。我尝试使用不同的方法进行实验,看看哪些有效,哪些无效,以及 - 最重要的是 - 为什么有效或无效。
猜你喜欢
  • 2016-12-15
  • 2019-01-20
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多