如何在 Angular 2 中创建单例服务?

新手上路,请多包涵

我读过在引导时注入应该让所有子级共享同一个实例,但是我的主组件和标头组件(主应用程序包括标头组件和路由器出口)都获得了我的服务的单独实例。

我有一个用于调用 facebook javascript api 的 FacebookService 和一个使用 FacebookService 的 UserService。这是我的引导程序:

 bootstrap(MainAppComponent, [ROUTER_PROVIDERS, UserService, FacebookService]);

从我的日志来看,引导调用似乎完成了,然后我看到 FacebookService 然后在每个构造函数中的代码运行之前创建了 UserService,MainAppComponent、HeaderComponent 和 DefaultComponent:

在此处输入图像描述

原文由 Jason Goemaat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 578
2 个回答

杰森完全正确!这是由依赖注入的工作方式引起的。它基于分层注入器。

Angular2 应用程序中有几个注入器:

  • 引导应用程序时配置的根目录
  • 每个组件一个注射器。如果您在另一个组件中使用一个组件。组件注入器是父组件的子组件。应用程序组件(您在提升应用程序时指定的组件)将根注入器作为父注入器)。

当 Angular2 尝试在组件构造函数中注入一些东西时:

  • 它查看与组件关联的注入器。如果有匹配的,它将使用它来获取相应的实例。这个实例是延迟创建的,并且是这个注入器的一个单例。
  • 如果此级别没有提供者,它将查看父级注入器(依此类推)。

因此,如果您想为整个应用程序创建一个单例,您需要在根注入器或应用程序组件注入器级别定义提供程序。

但是 Angular2 会从底部查看注入器树。这意味着将使用最低级别的提供程序,并且关联实例的范围将是此级别。

有关更多详细信息,请参阅此问题:

原文由 Thierry Templier 发布,翻译遵循 CC BY-SA 3.0 许可协议

嗯,Angular 服务的范围取决于您在根模块、延迟加载模块或组件级别提供服务的位置。

这是一个视频,它用真实的例子很好地描述了它。

https://youtu.be/aDyqnQrer3o

原文由 Front Pro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进