Angular-如何清除注销时在服务构造函数上实例化的数据?

dev*_*evN 3 typescript angular

我正在使用GlobalDataService从此处引用)将响应API的登录数据存储在全局变量中,以用于其他一些API调用。

登录():

 if (_token) {

    // store username and jwt token in keep user logged in between page refreshes
    console.log(this.gd.currentUserData)
    this.gd.currentUserData['userID']=_id;
    this.gd.currentUserData['username']=username;
    this.gd.currentUserData['token']=_token;
    // return true to indicate successful login
    return true;
}
Run Code Online (Sandbox Code Playgroud)

然后在内部xx.service.ts文件中,我正在访问此全局变量,如下所示,该变量constructor()然后由各种函数使用以进行API调用。

constructor(private http: Http,  private gd: GlobalDataService) {

    let currentUser = this.gd.currentUserData;

     this.token = currentUser && currentUser.token;
     this.userID=currentUser.userID;

}
Run Code Online (Sandbox Code Playgroud)

问题

我注销(在此期间清除了全局变量中的数据)然后使用另一个用户帐户登录后,其中的功能service.ts仍在使用存储在那些全局变量中的先前数据。

内部logout():

this.gd.currentUserData={};
this.gd.currentHospitalData={};
Run Code Online (Sandbox Code Playgroud)

我认为问题是构造函数仅实例化一次,因此分配给全局变量的新数据不会反映在.service.ts文件中。

如何解决此问题?还是有更好的方法来处理这种情况?

注意:以前我曾经localstorage存储过这些数据,但是由于可以通过Chrome Dev Tools进行修改,因此我现在考虑使用全局变量。

更新资料

我知道这是很棘手的方法,不是正确的方法,但是我注意到调用window.location.reload();logout()可以解决问题。

显然,此问题已解决。我必须将我的服务的提供程序声明从app.module.ts应用程序组件中的较低级别移到较低级别,然后将成功的登录重定向到。

但是我仍在寻找登录数据处理的适当解决方案/方法。

dev*_*evN 5

真正的问题是我已经宣布.service.ts内部为Provider app.mopdule.ts。这导致这些服务的构造函数仅在应用程序首次加载时实例化。因此,当我注销并再次登录时,新分配的数据未反映在这些.service.ts文件中,

在成功登录后,我将这些服务的提供程序声明移到了要重定向到的组件上。现在,每次成功登录后,构造函数将实例化,新分配的值将在这些.service.ts文件中反映。

  • 在组件中添加提供者声明没有帮助吗?这只是在重定向的组件中创建一个新实例,而应用程序的其余部分将使用相同的旧实例。 (2认同)