首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Angular :注销时销毁服务变量

Angular :注销时销毁服务变量
EN

Stack Overflow用户
提问于 2018-10-02 01:54:18
回答 2查看 6.9K关注 0票数 2

我正在做一个angular项目,在这个项目中我有一个服务(reports.service.ts),它被添加为app.module.ts中的提供者。

后来,该服务在许多组件中使用,当用户执行操作时,这些组件会修改该服务中的变量。

后来,我想在用户注销时将这些服务变量重置为null (并希望在整个应用程序/其他组件中反映这一点)。

这是我所做的:

代码语言:javascript
复制
logout() {
    delete localStorage[AppConfig.USER_INFO_KEY];
    delete localStorage['CURRENT_BOT'];
    delete localStorage['DATE_OBJ'];
    this.Service.savedData = {};
    this.Service.dateObj = {};
    this.Service.token = '';
    this.Service.deleteMsg = '';
    this.router.navigate(['/login']);
}

问题是,当我像以前那样重置这些变量时,这只会重置此logout()函数所在的模块中的变量。

附言:我没有在其他组件中单独提供reports.service.ts,只是在app.module.ts中添加了它。

EN

回答 2

Stack Overflow用户

发布于 2018-10-02 02:16:00

真奇怪。理想情况下,如果服务是在根模块中提供的,则它作为依赖项注入的所有位置都共享相同的服务实例。因此,如果服务上有任何变化,理想情况下应该反映在所有这些组件中。

除非您在SharedModule中有此服务,然后您还具有延迟加载的功能模块。在这种情况下,每个延迟加载的模块将接收该服务的不同实例。

这就是为什么,Angular condemns providing Services in the Shared Module

为什么?导入共享模块的延迟加载功能模块将创建自己的服务副本,并可能产生不希望看到的结果。

修复:

具有要在CoreModule中提供的状态数据的所有服务的Angular Style Guide recommends。然后应该将CoreModule注入到AppModule中。

确实在CoreModule中放置了一个单例服务,其实例将在整个应用程序中共享(例如ExceptionService和LoggerService)。

此外,您应该仅在CoreModule AppModule中导入

这样,您的应用程序中将只有一个这些服务的实例(当然,除非您在组件中提供服务)。

因此,如果您尚未创建CoreModule,则应该考虑创建它,并开始将所有这些服务移动到CoreModule中,对于这些服务,您需要一个应用程序范围的实例。

此外,请考虑实现,以便在尝试在AppModule以外的任何模块中导入CoreModule时抛出错误

票数 3
EN

Stack Overflow用户

发布于 2018-10-02 02:35:40

为了删除/移除本地存储项,正确的方法是removeItem(key)。您的代码应该如下所示。

代码语言:javascript
复制
logout() {
    localStorage.removeItem(AppConfig.USER_INFO_KEY);
    localStorage.removeItem(CURRENT_BOT);
    localStorage.removeItem(DATE_OBJ);
    this.Service.savedData = {};
    this.Service.dateObj = {};
    this.Service.token = '';
    this.Service.deleteMsg = '';
    this.router.navigate(['/login']);
}

如果您使用的是angular 6+,您的服务(reports.service.ts)文件应具有

代码语言:javascript
复制
@Injectable({
  providedIn: 'root',
})

要注入ReportService,必须将类型为ReportService的私有reportService参数添加到构造函数中,如下所示。

代码语言:javascript
复制
constructor(private reportService: ReportService) { }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52596379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档