我不知道是谁写的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)是正确的。
严格的第一点是真实的。 https://angular.io/docs/ts/latest/api/core/index/Injectable-decorator.html – silentsod
@silentsod感谢,并修正第二? – Kuan