使用分层注入时,非根注入器中提供的依赖项的生命周期是多少?
上下文
我的Angular 2应用程序包含几个部分。根组件中有一个@RouteConfig
,其中包含指向组件A
,B
和C
的路由。组件B
有一个子@RouteConfig
到子x
和y
。
/A
/B
/x
/y
/C
组件x
需要服务q
。根据{{3}}中的建议,我在组件x
级别为注入器提供了服务,即
@xComponent({
providers: [q]
})
export class xComponent { ... }
服务q
在内部请求和缓存一些数据。我的印象是服务是单身,在随后访问/B/x
时,数据可以从缓存中获得。但是,通过上述设置,每次用户打开部分/B/x
时,都会再次请求数据。我在服务console.log("creating q")
的构造函数中添加了q
,并且每当访问/B/x
时都会看到创建新服务实例。
如果我在组件/B
级别提供服务,则在/B/x
和/B/y
之间导航时会缓存该值,但在导航到/A
或/C
。
当组件被破坏时,似乎注射器被破坏。这是预期的行为吗?
配置应用程序的正确方法是什么,以便不会重新创建服务?显然我可以在根组件级别提供服务,但也许我错过了什么?
答案 0 :(得分:2)
Angular2团队成员多次强调DI所维持的实例不单身人士(他们认为单身人士的设计模式并不太好)。
相反,Angular2 DI为每个提供商维护一个实例。
Angular还会创建一个类似于组件树的注入器树。
创建组件时,会创建此组件的新子注入器(并在销毁组件时也将其销毁)
子注入器从组件providers:
列表中获取自己的一组提供者。
如果子进样器无法找到所请求密钥(令牌或类型)的提供者,它会将请求转发给父进样器。
<强>结论强>
如果您想确保在您的应用程序中只创建一个服务的单个实例,请使用您的根组件的providers: [...]
列表(建议)或bootstrap(...)
注册它。
答案 1 :(得分:1)
您完全了解喷油器的行为。它们被添加到组件中并被组件销毁。
因此,在您的情况下,您确实需要将服务添加为全局服务。这将使它成为一个单身&#34;。
其他链接
如果您想了解更多关于angular2中的依赖注入的信息,我可以推荐这篇文章:http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html