服务生命周期(销毁服务)

Services lifecycle (destroy a service)

我的应用程序的架构如下:

用户登录后,我导航到 MainModule(懒惰),我在其中注册 MainModule 中使用的服务组件。 CarService 缓存 web 服务的结果,因此,如果用户注销,我需要销毁此服务。 当用户注销时,我导航到 LoginModolue.

我以为导航到 LoginModuleMainModule 会被销毁(实际上我在 MainModule,不在 AppModule 中)但我注意到,如果我再次登录,旧缓存仍然存在。 这是正常的吗? 当我导航到 LoginModule?

时,不应破坏 MainModule 中提供的服务

事实并非如此。移动到其他模块并不意味着之前的延迟加载模块将被销毁。它仍然会存在。这就是为什么当我们尝试再次导航到该模块时 Angular 不请求该延迟加载模块的块。

该服务也将保留在内存中。只有当用户手动重新加载应用程序时,服务才会重新初始化。

在将用户导航到 /login 路由之前,您必须手动清理缓存。执行此操作的理想位置可以是您导航离开的组件的 ngOnDestroy

你会预料到会发生这种情况,不幸的是,由于惰性模块的性质,这不会发生,阅读 here 为什么不呢。基本上延迟加载的模块留在内存中。

然而,您可以做的是将提供程序放在主组件视图中:

@NgModule({
  declarations: [
     MainComponent
  ]
})
export class MainModule {}

@Component({
  //...
  providers: [ CarService ]
})
export class MainComponent {}

这将在 MainComponent 被销毁时销毁 CarService 实例