空的 @Injectatble() 装饰器在 Angular 中实际上意味着什么?

问题描述 投票:0回答:1

我不经常进行 Angular 开发。我了解到的关于

@Injectable()
装饰器的一件事是,它意味着 - “这个类可以拥有/接受注入的依赖项” “这个类可以作为依赖项注入”。我无法立即参考任何特定来源(记性不好,变老),但它来自在线文章,可能是一些教程。顺便说一下,我说的是一个空的
@Injectable()
,而不是具有
provided-in
属性的。

无论如何,看起来 Angular 文档的叙述已经改变以反映后来的含义。 这里它说装饰器的目的是

表明该类可以被注入。

还有这里那个-

@Injectable() 装饰器指定 Angular 可以在 DI 系统中使用此类。

所以-

  1. 空的
    @Injectable()
    装饰器实际上表示什么?
  2. 如果
    @Injectable()
    的含义是“这个类可以作为依赖项注入”,那么我为什么可以使用服务类而不需要
    @Injectable()
    装饰器作为依赖项并且它仍然可以正常工作?
angular dependency-injection injectable
1个回答
0
投票
  • 空的 @Injectable() 装饰器实际上表示什么?

该类是可以注入的依赖项,但请注意,如果没有

providedIn
属性,则必须将服务添加到提供者数组中,以便它对于依赖项注入可见!

  • 如果 @Injectable() 的含义是“这个类可以作为依赖项注入”,那么为什么我可以使用没有 @Injectable() 装饰器作为依赖项的服务类并且它仍然可以正常工作?

我希望看到这种情况发生,你只能使用类作为

const someClass = new SomeClass()
,或者你可以创建静态方法并像
SomeClass.someMethod
一样访问它们,其中方法将被定义为
static someMethod() {...}
,所以类无法用于依赖注入,因为
@Injectable()
指示 Angular 框架该类是一个服务,同样适用于
@Component
@Directive
,这就是注册 Angular 组件并使用它们的方式,否则它们就是 javascript 类,仅此而已!

普通 JS 类和 Angular 服务之间的区别在于

当您创建像

const someClass = new SomeClass()
这样的类时,它会创建一个新实例,因此该实例将拥有自己的一组属性和方法,这些对其他实例不可见。

当您在 DI 中声明服务时,单例将被共享到当前元素/模块,该元素/模块在提供者数组中具有该服务,并且对于所有子元素,相同的实例被共享。 ProvidedIn 意味着单个实例在整个应用程序中使用!

© www.soinside.com 2019 - 2024. All rights reserved.