【问题标题】:Best practices for Clearing data in services on logout in AngularJs在 AngularJs 中注销时清除服务中数据的最佳实践
【发布时间】:2014-12-18 19:31:10
【问题描述】:

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

class DataService   {

  private data;

  constructor($http)
  {
     $http.get(url).then((response) => 
       { 
          this.data = response.data;
       });
  }

}

这是打字稿,但解析为:

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

我可以使用This Question 中的答案清除数据 它正在做这样的事情:

$rootScope.on('logout',function(){
  this.data = [];
});

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

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

一种建议的解决方案是进行刷新,但这会带来糟糕的用户体验。

一种解决方案可能是让 Angular 相信服务从未被创建或完全重新加载 Angular。

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

【问题讨论】:

  • 有趣的问题。您的服务肯定不是所有都依赖于登录用户吗? TypeScript 可以在这里派上用场。你可以定义一个接口,比如ILoggedInUserService,它公开了一个tearDown() 方法。这将迫使开发人员为所有适用的服务实现此方法。然后您可以enumerate 并在注销时执行
  • 我通过广播一个事件来处理它,所有相关服务都通过监听该事件来清理它们的数据。这样可以保持代码整洁,没有相互依赖关系。

标签: javascript angularjs


【解决方案1】:

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

这还为您提供了一个优势,即您可以随时了解哪些服务数据需要清除,因为您将来可能会遇到例外情况。

另请参阅此答案供您参考:Injecting a service into another service in angularJS

【讨论】:

  • 您仍然需要指定单个数据,除非我们将所有服务数据存储在每个服务的单独对象中。然后删除这个对象会清除它。
  • @Kabahango,你有没有想出一种方法来解决这个问题,而不必指定你想要重置的每个属性?我觉得窗口重新加载选项可能比这更好。
  • 不完全是。但一个好的方法是制作“存储库模式”,以便您的应用程序中的所有数据都存储在一个或多个存储库中。这本身不是一种解决方法,但它是一种很好的设计模式。
  • 进一步使用解析可以更轻松地维护控制器将获得哪些数据
【解决方案2】:

您可以使用整页刷新:

$window.location.reload();

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

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

sessionStorage.clear();

【讨论】:

  • 使用 $window.location.reload() 会给 IMO 带来糟糕的用户体验。在用户看不到页面加载然后重新加载的情况下,我至少没有找到一个聪明的万无一失的方法。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2014-06-21
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多