2016-12-16 100 views
2

全部:我们什么时候需要在我们的Angular2服务上使用@Injectable?

我很喜欢Angular2,当我到达依赖注入部分时,@Injectable()表示法让我感到困惑。只是想确保我的约@Injectable理解()是正确的:

  1. @Injectable()指示类遵循它可以作为注射服务。
  2. @Injectable()表示该类下面有其他@Injectable()定义的服务注入。

这几乎是@Injectable()的意思?还有什么需要特别注意这个符号?

我们不能决定哪种情况发生(或两者都发生),直到我们查看类定义,它是正确的吗?

感谢

+0

严格的第一点是真实的。 https://angular.io/docs/ts/latest/api/core/index/Injectable-decorator.html – silentsod

+0

@silentsod感谢,并修正第二? – Kuan

回答

4

我不知道是谁写的documentation for @Injectable或者它被写时,却完全是误导:

这标志着作为提供给Injector创造A级标志的元数据。 ... Injector尝试实例化一个没有@Injectable标记的类时将抛出NoAnnotationError

您可以看到在Plunker中这不是真的。所以对于你的问题,(1)是错误的。

@Injectable注释实际上所做的是向Angular提供元数据,以了解它需要注入到服务中的内容。如果服务不需要任何注入,那么服务不需要元数据。但是如果它确实需要注入,并且没有元数据,您将会收到错误,因为Angular无法解析要注入的参数。

documentation for dependency injection,他们得到它一半权利(与矛盾的声明)。

为什么@Injectable()?

@Injectable()标志着一个类可用于喷油器实例化。一般而言,试图实例化未标记为@Injectable()的类时,注入器会报告错误。

碰巧,我们可能从HeroService的第一个版本中省略了@Injectable(),因为它没有注入参数。但我们现在必须拥有它,我们的服务具有注入依赖性。我们需要它,因为Angular需要构造器参数元数据才能注入记录器。

如果这听起来不矛盾,我不知道是什么。第一段听起来像以前的@Injectable文档,而第二段是正确的。

只要记住这只是建议我们总是添加@Injectable装饰我们所有的服务,我们以后可能会决定我们需要添加依赖参数,却忘了加@Injectable当我们这样做所以。

我们推荐将@Injectable()到每个服务种类,即使是那些没有依赖关系,因此,在技术上不要求它。这里的原因:

  • 未来保证:无需记住@Injectable()当我们在后面添加一个依赖。
  • 一致性:所有服务遵循相同的规则,我们不必奇怪为什么一个装饰缺失。

所以你的电话号码(2)是正确的。

相关问题