在AngularJs中注销时清除服务中数据的最佳实践

Cod*_*wer 13 javascript angularjs

我有几个服务使用Web服务并缓存大量结果.通过缓存我的意思是存储在服务上的变量.当用户注销时,应清除数据.服务如下所示(简化版):

class DataService   {

  private data;

  constructor($http)
  {
     $http.get(url).then((response) => 
       { 
          this.data = response.data;
       });
  }
Run Code Online (Sandbox Code Playgroud)

}

哪个是打字稿,但解析成这样的东西:

var DataService = (function () {
    function DataService($http) {
        var _this = this;
        $http.get(url).then(function (response) {
            _this.data = response.data;
        });
    }
    return DataService;
})();
Run Code Online (Sandbox Code Playgroud)

我可以使用本课题中的答案清除数据,这样 做是这样的:

$rootScope.on('logout',function(){
  this.data = [];
});
Run Code Online (Sandbox Code Playgroud)

但是,当我们有多个服务和控制器时,这是很多代码.我们都知道这个新人会在服务中添加一些新数据,并忘记将其添加到注销序列中.这简直是​​一种不好的做法.

类似地,数据存储在应用程序各个部分的$ scope中,这也必须清除.范围相当简单,因为控制器的构造函数在每次页面访问时加载,然后将覆盖数据.

一个提议的解决方案是进行刷新,但这会给用户带来可怕的体验.

一种解决方案可能是使角度相信从未创建过服务或完全重新加载角度.

做这个的最好方式是什么?将数据存储在服务变量中是不是很糟糕?

Tor*_*cht 10

您可以创建一个负责清除其他服务中所有数据的服务.在这种情况下,您只需要调用clear此服务的" "方法,并在此内部实现单独的clear调用(因此只实现一次).

这样,您还可以了解哪些服务数据需要始终清除,因为将来可能会有例外情况.

另请参阅此答案以供参考:在angularJS中将服务注入另一个服务


Mar*_*Ban 5

您可以使用整页刷新:

$window.location.reload();
Run Code Online (Sandbox Code Playgroud)

这将重新启动您的应用程序的整个状态

另一个解决方案是将所有内容存储在会话存储中,然后在注销时将其清除:

sessionStorage.clear();
Run Code Online (Sandbox Code Playgroud)

  • 使用$ window.location.reload()会给用户带来不良的IMO体验。在用户看不到页面加载然后重新加载的地方,我至少没有找到一种聪明的万无一失的方法。 (8认同)