javascript - AngularJs 服务,无法在本地存储

标签 javascript angularjs

我正在尝试将经过身份验证的用户保存到服务本地的变量中,但在第二次访问时无法看到相同的值。这是代码,

app.factory('Auth', ['$http', '$state',
function ($http, $state) {
    var currentUser = null;
    var authenticated = false;

    var setCurrentUser = function (user, flag) {
        currentUser = {};
        angular.extend(currentUser, user);
        authenticated = flag;
    };

    var getAuthenticated = function () {
        return authenticated;
    };

    var getCurrentUser = function () {
        return currentUser;
    };

    return {
        login: function (user, success, error) {
            $http.post(UserApi.login().url, user).success(function (user) {
                setCurrentUser(user, true);
                window.location.replace('/');
            }).error(error);
        },
        logout: function (success, error) {
            $http.post(UserApi.logout().url).success(function () {
                setCurrentUser(null, false);
                window.location.replace('/');
            }).error(error);
        },
        isAuthenticated: function () {
            if (getAuthenticated() && getCurrentUser() != null) return true;
            return false;
        }
    };
}]);

我希望在登录到 currentUser 并且状态为 authenticated 后存储用户详细信息, 当我尝试检查用户登录状态时,这两个变量持有 nullfalse,所以我失去了用户状态。那么如何正确地存储和检索数据以确保用户处于登录状态。

最佳答案

如评论中所述,Angular 服务是在页面内存中运行的 JavaScript 应用程序的一部分,因此只要您刷新页面,该服务就会重建。您必须选择持久性方案并使用其 API 才能在页面加载期间持久化任何内容。

您有几个选择:

  • sessionStorage:一直存在到您关闭浏览器窗口,但可以在页面之间使用。但是,打开同一 URL 的新选项卡将获得一个新的空 session 存储对象。这是一个很好的选择,仅适用于跨页面刷新传输数据。
  • localStorage:在同一域的窗口/选项卡之间保持不变,下次您打开浏览器时它仍然存在。
  • $cookieStore:一个对 cookie 的 Angular 包装器,它与 sessionStorage 类似,只是小得多,并且包含在对服务器发出的任何请求中。
  • > Many more esoteric choices并非所有浏览器都支持。该文章还很好地概述了网络存储选择。

实际上这与 Angular 关系不大,只是一个 JavaScript 持久性问题。

这是您使用 localStorage 的代码的一个小示例,可以帮助您入门:

var data = angular.fromJson(localStorage['my-storage-key']) || {
    currentUser: null,
    authenticated: false
};

var save = function () {
    localStorage['my-storage-key'] = angular.toJson(data);
};

var setCurrentUser = function (user, flag) {
    data.currentUser = {};
    angular.extend(data.currentUser, user);
    data.authenticated = flag;
    save();
};

var getAuthenticated = function () {
    return data.authenticated;
};

var getCurrentUser = function () {
    return data.currentUser;
};

关于javascript - AngularJs 服务,无法在本地存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082677/

相关文章:

javascript - JS 文件在刷新后在局部 View 中不起作用

javascript - 如何检查两条路由是否共享路径

javascript - 如何正确使用回调来使用 AngularJS 中的 API

javascript - 最大高度和 nanoscroller + AngularJS NgRepeat

javascript - Kendo Grid 和 ui-sref 四舍五入数

javascript - 如何在 JavaScript 的一行中调用一个可能不存在的方法而不出错?

javascript - JSON 解析无效字符串的有效行

javascript - GWT ScriptInjector VS 添加脚本标签到 index.html 页面

javascript - 单击 ionic 导航栏中的按钮移动到新页面的所有 3 种方法都不起作用

angularjs - AngularJS 中的 TypeScript 拦截器