Angular如何重新初始化单例服务

钟申

我有一个称为DesignerComponent的组件和一个共享名为ProjectService的服务的子组件,该服务在名为DesignerModule的模块中声明为提供程序,因为DesignerComponent和这些子组件必须共享ProjectService实例。

一切正常,但是当我转到另一个页面并返回该页面时,该服务仍保留所有旧数据,换句话说,永远不会重新创建此服务实例。当离开并返回模块或页面但仍然能够在子组件之间共享一个实例时,如何强制Angular创建一个新的服务实例?

app.module.ts
@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    HttpClientModule,
    FormsModule,
      RouterModule.forRoot([
        { path: '', loadChildren: () => import('./site/site.module').then(u => u.SiteModule) },
        { path: 'designer', loadChildren: () => import('./designer/designer.module').then(u => u.DesignerModule), canActivate: [AuthGuard] },
        { path: 'signin', loadChildren: () => import('./login/signin/signin.module').then(u => u.SigninModule) },
        { path: 'signup', loadChildren: () => import('./login/signup/signup.module').then(u => u.SignupModule) },
    ]),
    BrowserAnimationsModule,
    StoreModule.forRoot(reducers, {
      metaReducers,
      runtimeChecks: {
        strictStateImmutability: true,
        strictActionImmutability: true,
      }
    }),
  ],
  providers: [
    ScriptService,
    ComponentLoadService,
    MessagingService,
    { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
    { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
  ],
  bootstrap: [AppComponent],
})
export class AppModule { }

designer.module.ts
@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild([
      { path: ':id', component: DesignerComponent }
    ]),
    AngularSplitModule.forRoot(),
    ...
  ],
  declarations: [
     DesignerComponent,
     DesignerMenuComponent,
     ...
  ]
  providers: [
    ProjectService,
    ...
  ]
})
export class DesignerModule { }

project.service.ts
@Injectable()
export class ProjectService{
   private historyModule: ProjectUndoRedo[] = []; // This value still hold old data after going to another page and coming back. I want this service to be reinitialized
}

designer.component.ts
export class DesignerComponent{
   constructor(public projectService: ProjectService) {
      // When this constructor is called, projectSerivce instance is the old instance.
   }
}

designer-menu.component.ts
export class DesignerMenuComponent{
   constructor(public projectService: ProjectService) {
      // When this constructor is called, projectSerivce instance is the old instance.
   }
}
像素位

向NgModule添加的任何服务都向根注入器注册(或对于延迟加载的路由模块,注入延迟注入器)。因此,服务范围是应用程序范围的,并保留其值。

如果要缩小范围,请改为向组件注册服务:

@NgComponent({
    selector: 'app-designer',
    providers: [
       ProjectService
    ]
})
export class DesignerComponent {
}

这会将服务注册到组件注入器(它是分层的),并且其范围仅限于向其注册的组件的生存期。

当路由发生更改,并且Designer组件被另一个组件替换时,它将重新创建并重新初始化该组件(以及向其注册的所有提供程序)。

注意:由于服务的生命周期与组件的生命周期紧密相关,因此,如果需要,您还可以ngOnInitngOnDestroyDesignerComponent中执行服务的初始化例程,并在DesignerComponent中执行清理例程

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单例模式的延迟初始化

来自分类Dev

单例+初始化代码

来自分类Dev

从单例模型运行函数时出现“ NameError-未初始化的常量”

来自分类Dev

头文件中的C ++模板单例静态指针初始化

来自分类Dev

如何重新初始化dbus SessionBus

来自分类Dev

如何重新初始化抽搐?

来自分类Dev

如何重新初始化git repo?

来自分类Dev

如何在Play中初始化急切的单例而无需控制器请求?

来自分类Dev

在Java Jersey 2 JAX-RS中初始化单例

来自分类Dev

渴望初始化单例与延迟初始化单例

来自分类Dev

Angular 2服务的异步初始化

来自分类Dev

配置DI后ASP.NET Core初始化单例

来自分类Dev

.Net Core:如何初始化需要DBContext的单例?

来自分类Dev

初始化C ++ 11风格的单例

来自分类Dev

验证时重新初始化服务

来自分类Dev

初始化前如何更改单例模式

来自分类Dev

如何从初始化角度获得服务?

来自分类Dev

单例类中的初始化列表

来自分类Dev

依赖注入与单例,初始化

来自分类Dev

spring组件扫描是将所有对象初始化为单例还是惰性初始化?

来自分类Dev

如何为视图控制器提供指向已初始化的单例对象的指针?

来自分类Dev

Angular:如何使用参数初始化模块(或服务)?

来自分类Dev

如何重新初始化GoogleLogging?

来自分类Dev

使用单例设计统一的初始化

来自分类Dev

初始化完成前在单例上调用方法

来自分类Dev

我对单例初始化的理解正确吗?

来自分类Dev

类单例的初始化不能自动完成

来自分类Dev

单例类的 Java 静态初始化中的死锁

来自分类Dev

如何重新初始化所需的模块?