4

在我的控制器中,我存储数据,$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.']);
});
4

5 回答 5

3

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

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

于 2013-08-29T11:43:37.630 回答
3

手动跟踪和清理事物的另一种方法是在(或其他自定义事件)broadcast上设置“注销”事件。rootScope然后在您的控制器或服务中侦听事件以清理数据。

播送:

$rootScope.broadcast('logout');

监视事件(例如在服务中):

$rootScope.on('logout',function(){
  dossiers = [];
});
于 2013-08-30T07:31:21.110 回答
2

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

仅当您明确执行此操作或当对象持有者引用被销毁时,该引用才会被释放。

你可以尝试的是

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

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

于 2013-08-29T11:56:13.607 回答
2

如果您不介意注销时出现轻微的屏幕闪烁,您可以使用以下方法刷新页面:

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

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

于 2016-06-09T21:11:11.897 回答
0

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

于 2014-08-01T20:40:49.893 回答