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

Kua*_*uan 7 dependency-injection angular

所有:

我对Angular2很新,当我到达依赖注入部分时,这种@Injectable()符号让我感到困惑.只是想确保我对@Injectable()的理解是正确的:

  1. @Injectable() 表示该类遵循它可以作为服务注入.
  2. @Injectable()表示该类跟随它@Injectable()注入了其他已定义的服务.

这几乎@Injectable()意味着什么?还有什么需要特别注意这种表示法吗?

在查看类定义之前,我们无法确定哪种情况发生(或两者都发生),是否正确?

谢谢

Pau*_*tha 11

我不知道是谁编写了@Injectable文档或编写文档的时候,但这完全是误导性的:

标记元数据,用于将类标记为可Injector用于创建.... 在尝试实例化没有标记的类时Injector会抛出.NoAnnotationError@Injectable

你可以看到这个Plunker不是这样.所以对于你的问题,(1)是错误的.

什么@Injectable注释实际上做的是提供元数据,以角什么,它需要注入的服务.如果服务不需要注入任何内容,则该服务不需要元数据.但如果确实需要注入,并且没有元数据,则会出现错误,因为Angular无法解析要注入的参数.

依赖注入文档中,他们得到了一半的权利(带有矛盾的陈述).

为什么@Injectable()?

@Injectable()将类标记为可用于实例化的注入器.一般来说,当尝试实例化未标记为的类时,注入器将报告错误@Injectable().

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

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

请记住,我们总是建议我们总是@Injectable在所有服务上添加装饰器,因为我们稍后可能会决定添加依赖项参数,但是忘记@Injectable在我们这样做时添加.

我们建议添加@Injectable()到每个服务类,甚至是那些没有依赖项的服务类,因此在技术上不需要它.原因如下:

  • 面向未来:无需记住@Injectable()我们何时添加依赖项.
  • 一致性:所有服务都遵循相同的规则,我们不必怀疑为什么缺少装饰器.

所以你的号码(2)是正确的.