Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在AngularJs中注销时清除服务中数据的最佳实践_Javascript_Angularjs - Fatal编程技术网

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

Javascript 在AngularJs中注销时清除服务中数据的最佳实践,javascript,angularjs,Javascript,Angularjs,我有几个使用webservice的服务,它们缓存了很多结果。所谓缓存,是指在服务上存储一个变量。当用户注销时,应清除数据。 这些服务如下所示(简化版): } 这是typescript,但解析为如下内容: var DataService = (function () { function DataService($http) { var _this = this; $http.get(url).then(function (response) {

我有几个使用webservice的服务,它们缓存了很多结果。所谓缓存,是指在服务上存储一个变量。当用户注销时,应清除数据。 这些服务如下所示(简化版):

}

这是typescript,但解析为如下内容:

var DataService = (function () {
    function DataService($http) {
        var _this = this;
        $http.get(url).then(function (response) {
            _this.data = response.data;
        });
    }
    return DataService;
})();
我可以使用中的答案清除数据 就是这样做的:

$rootScope.on('logout',function(){
  this.data = [];
});
然而,当我们有多个服务和控制器时,这是很多代码。我们都知道,这个新家伙会向服务中添加一些新数据,但他忘了将其添加到注销序列中。这只是一种不好的做法

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

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

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


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

您可以使用整页刷新:

$window.location.reload();
这将重新启动应用程序的整个状态

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

sessionStorage.clear();

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

这还为您提供了一个优势,即您可以随时了解需要清除哪些服务数据,因为将来可能会出现异常


另请参见此答案以供参考:

有趣的问题。当然不是所有的服务都依赖于登录用户吗?TypeScript在这里可能很有用。您可以定义一个接口,比如
ILoggedInUserService
,它公开一个
tearDown()
方法。这将迫使开发人员对所有适用的服务实现此方法。然后,您可以在注销时执行,我通过广播事件来处理它,所有相关服务通过监听该事件来清理它们的数据。这可以保持代码整洁,没有相互依赖性。使用
$window.location.reload()
会给我带来糟糕的用户体验。我至少还没有找到一种聪明、简单的方法,在用户看不到页面加载,然后页面重新加载的情况下执行此操作。您仍然需要指定单个数据,除非我们将所有服务数据存储在每个服务的单独对象中。然后删除这个对象就会清除它。@Kabahango,你有没有找到一种不用指定每个要重置的属性就可以绕过它的方法?我觉得窗口重新加载选项可能比这个更好。不完全是。但一个好方法是创建“存储库模式”,这样应用程序中的所有数据都存储在一个或多个存储库中。这本身不是一个解决方法,但它是一个很好的设计模式。此外,使用resolves可以更容易地维护控制器将获得的数据
sessionStorage.clear();