在Angular js中注销时清除$ scope

时间:2013-08-29 11:28:58

标签: javascript angularjs

在我的控制器中,我将数据存储为$scope.$parent.dossierSummaries = data; 但在注销并登录后,应用程序$scope.$parent.dossierSummaries会保留相同的旧数据。

我在退出时这样做

.success( function( response, status ) {
    if ( response.status > 0 ) {
        var u = $rootScope.user.username;
        $cookieStore.remove('myapp');
        $rootScope.user = { username: '', role: 0 };
        success(u);
    }
    else {
        error(response.messages);
    }
})
.error( function( response, status ) {
    error(['There was an error logging you out.']);
});

5 个答案:

答案 0 :(得分:3)

在angularJS中,您不应该将变量直接设置为控制器,而应该从服务中检索它。因此,无论何时加载控制器,都应编写init()函数来获取该模型的值。因此,每次您从服务器获得正确的数据。

代码示例和文档:http://docs.angularjs.org/guide/dev_guide.services.creating_services

答案 1 :(得分:3)

手动跟踪和清理内容的另一种方法是broadcast(或其他自定义事件)上的rootScope'注销'事件。然后在控制器或服务中监听事件以清理数据。

广播:

$rootScope.broadcast('logout');

观看活动(例如在服务中):

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

答案 2 :(得分:2)

我认为没有任何有效的方法来实现它。任何对象(控制器,指令,过滤器或事实上任何js对象)都可以保存对另一个对象的引用(在您的情况下是用户),并且无法轻易确定谁都持有引用。

如果你明确地或者当对象持有者的引用被销毁时,引用只会被释放。

您可以尝试的是

$rootScope.user.username='';
$rootScope.role=0; 

假设某个对象正在跟踪此特定对象,则现在将清除数据。

答案 3 :(得分:2)

如果您在注销时不小心屏幕闪烁,可以使用以下方法刷新页面:

$window.location.replace($window.location.toString().split('#')[0]);

这会清除所有$scope$rootScope变量,在我的情况下已经解决了这个问题。

答案 4 :(得分:0)

如果你想清除$ scope,我认为你可以使用它的构造函数方法或 proto (原型),它在构造函数中使用。我相信你可以这样做将范围重置为初始状态。如果有人对此有所了解,请随时发表评论。