我正在做一个angular项目,在这个项目中我有一个服务(reports.service.ts),它被添加为app.module.ts中的提供者。
后来,该服务在许多组件中使用,当用户执行操作时,这些组件会修改该服务中的变量。
后来,我想在用户注销时将这些服务变量重置为null (并希望在整个应用程序/其他组件中反映这一点)。
这是我所做的:
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中添加了它。
发布于 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时抛出错误
发布于 2018-10-02 02:35:40
为了删除/移除本地存储项,正确的方法是removeItem(key)。您的代码应该如下所示。
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)文件应具有
@Injectable({
providedIn: 'root',
})要注入ReportService,必须将类型为ReportService的私有reportService参数添加到构造函数中,如下所示。
constructor(private reportService: ReportService) { }https://stackoverflow.com/questions/52596379
复制相似问题