Angularjs:为啥页面刷新会破坏 $rootScope 的值?

Posted

技术标签:

【中文标题】Angularjs:为啥页面刷新会破坏 $rootScope 的值?【英文标题】:Angularjs: Why page refresh destroy the values of $rootScope?Angularjs:为什么页面刷新会破坏 $rootScope 的值? 【发布时间】:2015-07-03 04:41:55 【问题描述】:

在我的本地路由http://localhost:9000/#/deviceDetail/ 中,我有一个管理该视图的控制器。在进入该视图之前,我将一些变量设置为$rootScope例如$rootScope.dashboards)。

一旦在该视图上,我可以访问仪表板属性,但是当我使用 F5 键刷新页面时,例如属性仪表板会丢失。

我尝试将 $rootScope 保存在 localStorage 变量中,但使用 JSON.stringify 方法时遇到循环引用问题。

有什么技巧可以管理吗?

【问题讨论】:

你可以试试这个angular module 我认为您的问题是您没有使用正确的路由器,并且无法在路由更改时加载必要的数据,而不是像“点击”这样的操作。 【参考方案1】:

AngularJS 是一个 javascript 框架,所有的东西都存储在内存堆中,当你打开一个页面时这个堆就开始了,你关闭它之后它就被销毁了。在这种情况下,浏览器刷新就像关闭和重新打开页面一样。

要在刷新后保留该值,您应该将其存储在 cookie 中,为此您可以使用例如 $cookies 或 sessionStorage / localStorage,这是 M K 推荐的。

【讨论】:

Cookies 实际上是个坏主意。您应该改用 localStorage。 我推荐它是因为$cookies 默认是有角度的,但你必须以“普通方式”访问 localStorage 或添加额外的模块。 OP 确实说他们尝试了localStorage 并遇到了问题。你回答了why,但没有回答how 我确定此错误与 JSON.stringify 无关,而是与您正在做的其他事情有关。也许只是将您需要的东西串起来而不是整个$rootScope 将是一件好事。而且效率更高。 没有办法你应该需要整个 rootScope,如果你这样做,你做错了。仅存储您要添加的 rootScope 中的值,并在打开页面时将它们加载到 rootScope 中。你也可以使用 localStorage 来做到这一点。【参考方案2】:

使用 localStorage 和 $stateChangerStart 检查你是否使用 ui.route 像这样的

$rootScope.$on('$stateChangeStart', function(event, toState) 

            // Grab the user from local storage and parse it to an object
            var user = JSON.parse(localStorage.getItem('user'));            

            if(user) 

                $rootScope.currentUser = user;

            
        );

【讨论】:

【参考方案3】:

在Getting started with AngularJS and ASP.NET MVC - The long awaited Part Three 的文章之后,我尝试使用 cookie 存储身份验证令牌。但是每当我按 F5 或刷新 Chrome 浏览器时,cookie 就会被破坏。

那篇文章说 ngCookies 有助于处理页面刷新以维护页面刷新的令牌。我曾认为它确实如此,但我不知道 ngCookies 杀了我。如果页面刷新,它就会被破坏!经过数小时的在线研究后,我发现这篇文章对我有帮助。

根据 M K 的说法,我使用 localStorage(或 sessionStorage)帮助我摆脱了 cookie 的头痛。 使用 cookie 来存储身份验证令牌或其他东西是个坏主意。正如上面提到/确认的那样,我遇到了这个问题,我迷路了(不知道来自“使用 cookie”的错误)。所以,这是那篇文章中的一个错误。

谢谢你百万次,M K。

【讨论】:

正好有这个问题,文章有bug!我通过在 app.module 中导入 ngStorage 解决了这个问题,并在我的会话服务中使用了$localStorage 和以下代码:this.getToken = function () if (!$localStorage.myApp) if (!this.token) return undefined; this.setToken(this.token); return $localStorage.myApp; this.setToken = function (token) this.token = token; $localStorage.myApp = token;

以上是关于Angularjs:为啥页面刷新会破坏 $rootScope 的值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我登录之前创建了一个新会话?

在 UITableViewController 的 refreshControl 上缓慢向下滑动刷新会导致视图跳下

Swift UIRefresh Control 在 UITableView 中拖动刷新会导致应用崩溃

vue 路由传参及解决动态路由传参刷新会消失问题

为啥添加 DataTables 会破坏我的页面? [关闭]

AngularJS地址栏变化为啥不跳转到页面