【问题标题】:How to display current data from localStorage?如何显示来自localStorage的当前数据?
【发布时间】:2017-02-10 09:29:40
【问题描述】:

我可以从 localStorage 登录、注销并显示已登录的用户信息,但是如果我使用不同的用户应用程序注销并再次登录,则会显示以前用户的信息!这不应该发生,因为我可以在 localStorage 中看到新的用户数据。如果我手动刷新页面,新数据会正确显示!

我需要这个应用程序来显示当前登录的用户数据,因为它已经在 localStorage 中可用..

routes.js

angular.module('app.routes', [])

.config(function($stateProvider, $urlRouterProvider) {

  $stateProvider

  .state('menu', {
    url: '/side-menu',
    templateUrl: 'templates/menu.html',
    controller: 'menuCtrl'
  })

  .state('login', {
    url: '/login',
    templateUrl: 'templates/login.html',
    controller: 'loginCtrl'
  })

  .state('menu.welcome', {
    url: '/welcome',
    views: {
      'side-menu21': {
        templateUrl: 'templates/welcome.html',
        controller: 'welcomeCtrl'
      }
    }
  })

$urlRouterProvider.otherwise('/user-type')

});

登录: 在这里,我通过 Web 服务对用户进行身份验证,该服务以 JSON 格式发回用户对象,该对象存储在 localStorage 中,键为“user”,并且工作正常。

.controller('loginCtrl', ['$scope', '$stateParams', '$state', '$http', 
    function ($scope, $stateParams, $state, $http) {
        $scope.user = {
            username: '',
            password: ''
        };
        $scope.login = function(){
            var apiUrl = "...";
            return $http.post(apiUrl, $scope.user).then(function(response){
                window.localStorage.setItem('user', angular.toJson(response.data));
                $state.go('menu.welcome');
            });
        };
    }
])

退出: 在这里,我通过从 localStorage 中删除 'user' JSON 对象来注销用户,并将他重定向回登录状态,它工作正常。

.controller('menuCtrl', ['$scope', '$stateParams', '$state', 
    function ($scope, $stateParams, $state) {
        $scope.user = angular.fromJson(window.localStorage.getItem('user'));
        $scope.logout = function(){
            // here i'm removing user from localStorage
            window.localStorage.removeItem('user');
            $state.go('login');
        };
    }
])

菜单: 在这里,我正在显示从“menuCtrl”发送的用户信息(即使它在 localStorage 中可用,它也不会在此处更新登录用户的数据)

<h3 id="menu-heading1" class="left-menu-headings">{{user.first_name}} {{user.last_name}}</h3>
<h4 id="menu-heading2" class="left-menu-headings">{{user.email}}</h4>

我已经在注销功能中尝试了以下操作,但没有成功:

$window.localStorage.clear();
$ionicHistory.clearCache();
$ionicHistory.clearHistory();

知道为什么它不显示来自 localStorage 的当前数据吗?

【问题讨论】:

  • 也许在路由配置中设置页面不被缓存?另外,如果您只是从控制台获取 localStorage,您会看到该对象吗?
  • 是的,我可以在 chrome 开发人员 -> 应用程序 -> 本地存储中看到更新的键和值
  • 我在注销时使用$window.location.reload(true); 暂时解决了这个问题,如果我找到了一些解决方案来刷新登录时所有控制器的范围,我会报告..

标签: javascript html ionic-framework local-storage ionic2


【解决方案1】:

使用 ion view enter 定义你的用户

$scope.$on( "$ionicView.enter", function( scopes, states ) {
        $scope.user = angular.fromJson(localStorage.get("user"));
    });

从控制器声明中删除集合。 这将使用户在每次进入时加载,而不是每次控制器初始化时加载

【讨论】:

  • 它就像一个魅力!谢谢 - @misha130,如果我能从服务中做到这一点会更好?
  • 我猜你可以从服务或服务 $broadcast 来表示刷新。
  • 任何代码提示将不胜感激.. :) 例如:.factory('UserFactory', function(){ var getUser = function(){ return angular.fromJson(window.localStorage.getItem('user')); }; return { getUser: getUser, }; })
【解决方案2】:

清空或删除 $scope.user

.controller('menuCtrl', ['$scope', '$stateParams', '$state', '$window',
function ($scope, $stateParams, $state) {
    $scope.user = angular.fromJson(window.localStorage.getItem('user'));
    $scope.logout = function(){
        // here i'm removing user from localStorage
        $window.localStorage.removeItem('user');
        $state.go('login');

        delete $scope.user;

        /*or $scope.user = {}*/

    };

    $scope.login = function(){
        var apiUrl = "...";
        return $http.post(apiUrl, $rootScope.user).then(function(response){
            $window.localStorage.setItem('user', angular.toJson(response.data));
            // update $rootScope.user:
            $rootScope.user =  angular.fromJson($window.localStorage.getItem('user'));
            $state.go('menu.welcome');
        });
    };
}
])

【讨论】:

  • 效果与 - @Shadi Shaaban 回复相同!意味着下次登录时所有值都是空的,除非我刷新页面!
  • 你不能使用 window 你必须使用 $window ...我在第一次拍摄时错过了...查看我的编辑
  • $window或window没有区别!
【解决方案3】:

使用 $rootScope:

这个问题主要是由于menuController被视图共享并且没有被重新加载,在这种情况下,您可以使用$rootScope.user,它不像$scope.user被所有控制器共享,使用如下:

注销控制器

.controller('menuCtrl', ['$scope', '$stateParams', '$state', 
function ($scope, $stateParams, $state, $rootScope) { // <-- add $rootScope

    // use $rootScope.user instead of $scope.user
    $rootScope.user = angular.fromJson(window.localStorage.getItem('user'));

    // rest of your code is fine.
    $scope.logout = function(){
        // here i'm removing user from localStorage
        window.localStorage.removeItem('user');
        $state.go('login');
    };
 }

登录控制器

.controller('loginCtrl', ['$scope', '$stateParams', '$state', '$http', 
    function ($scope, $stateParams, $state, $http, $rootScope) { // <-- add $rootScope
        // $scope.user = { <-- change to $rootScope
        $rootScope.user = {
            username: '',
            password: ''
        };

        $scope.login = function(){
            var apiUrl = "...";
            return $http.post(apiUrl, $rootScope.user).then(function(response){
                window.localStorage.setItem('user', angular.toJson(response.data));
                // update $rootScope.user:
                $rootScope.user =  angular.fromJson(window.localStorage.getItem('user'));
                $state.go('menu.welcome');
            });
        };
    }
])

【讨论】:

  • 谢谢@shadi - 如果我的视图被缓存,它还能工作吗?
  • 你知道在缓存视图中重新加载数据的方法吗?
  • 视图缓存与视图中使用的变量无关,像{{user.username}}这样的变量应该始终反映范围内的最新值,无论视图是否被缓存,视图缓存用于避免每次加载视图时读取标记/html 结构。
  • 显示了 $scope 数据,但在我刷新页面之前甚至没有显示 $rootScope 数据!
  • 确保在所有情况下都使用$rootScope.user 而不是$scope.user,并在控制器定义签名中添加$rootScope,如上所示,$rootScope 有一个共享的$scope你所有的控制器。
【解决方案4】:

根据您的控制器名称,我有一个疯狂的猜测,“menuCtl”实际上是在重新登录期间存在的,因此它永远不会重新初始化。您应该在

周围添加一些 console.logs
$scope.user = angular.fromJson(window.localStorage.getItem('user'));

在您重新登录时查看它是否被第二次调用。如果没有,您可能需要遵循许多选项,例如,向控制器添加事件侦听器,并在登录/注销时广播事件,以便控制器刷新其范围数据。

【讨论】:

  • 我尝试访问另一个控制器模板中的数据,它给了我相同的结果,例如我使用 user1 登录(它显示 user1 的数据),注销并使用 user2 登录(它显示 user1 的数据,直到我刷新页面)..
  • 但是当您重新登录时这些控制器会重新创建吗?您可以显示您的应用程序路由代码吗?和html结构。
  • 而且,顺便说一句,他们使用的是隔离作用域还是共享作用域?
  • 我的项目配置和你从ionic creator侧边菜单模板下载的完全一样。
  • 嗯...是的。看起来不错。您是否尝试将 console.log 放在 $scope.user 初始化行周围以查看其内容以及是否在重新登录时第二次执行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2019-09-25
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多