【问题标题】:Angularjs Error: null is not an object (evaluating 'a.$current.locals[l]')Angularjs 错误:null 不是对象(评估 'a.$current.locals[l]')
【发布时间】:2015-05-09 02:23:14
【问题描述】:

我设置了一个 Angular 项目,当用户转到 /cloud 并且他们没有登录(isLoggedIn() 返回失败)时,它会重定向到 /login。然后,如果他们登录并转到/login,它会将他们重定向回/cloud

但是,当我单击注销按钮清除本地存储时,出现以下错误(一切仍然有效):

错误:null 不是对象(评估 'a.$current.locals[l]')

根据我的日志,它似乎发生在我的注销控制器的 onEnter 上。

我是 Angular 新手,因此非常感谢任何建议或指导。

var routerApp = angular.module('myapp', ['ui.router'])
    //config for state changes
    .factory('Auth', function($http, $state, $q) {

        var factory = { isLoggedIn: isLoggedIn };
        return factory;

        function isLoggedIn(token) {
            return $http.post('/auth/session', {token:token});
        }

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

        $locationProvider.html5Mode(true);
        $urlRouterProvider.otherwise('/cloud');

        var authenticated = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) { 
            var deferred = $q.defer();
            if (typeof window.localStorage['authtoken'] === 'undefined') {
                var authtoken = undefined;
            } else {
                var authtoken = window.localStorage['authtoken'];
            }
            Auth.isLoggedIn(authtoken).then(function() {
                deferred.resolve();
            }, function() {
                deferred.reject();
            });
            return deferred.promise;
        }];

        var authGuest = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) { 
            var deferred = $q.defer();
            if (typeof window.localStorage['authtoken'] === 'undefined') {
                var authtoken = undefined;
            } else {
                var authtoken = window.localStorage['authtoken'];
            }
            Auth.isLoggedIn(authtoken).then(function() {
                deferred.reject();
            }, function() {
                deferred.resolve();
            });
            return deferred.promise;
        }];

        $stateProvider

            .state('login', {
                url: '/login',
                templateUrl: 'pages/templates/login.html',
                resolve: { authenticated: authGuest }
            })

            .state('logout', { url: '/logout', onEnter: function($state) { localStorage.clear(); $state.go('login'); } })

            .state('cloud', {
                url: '/cloud',
                templateUrl: 'pages/templates/cloud.html',
                resolve: { authenticated: authenticated }
            })

    })
    .run(function ($rootScope, $state) {
        $rootScope.$on('$stateChangeError', function (event, from, error) {
            if(from.name == "login") {
                $state.go('cloud');
            } else {
                $state.go('login');
            }
        });
    });

【问题讨论】:

标签: javascript angularjs local-storage angular-ui-router


【解决方案1】:

问题似乎出在这里:

    var authenticated = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) { 
        var deferred = $q.defer();
        if (typeof window.localStorage['authtoken'] === 'undefined') {
            var authtoken = undefined;
        } else {
            var authtoken = window.localStorage['authtoken'];
        }
        Auth.isLoggedIn(authtoken).then(function() {
            deferred.resolve();
        }, function() {
            deferred.reject();
        });
        return deferred.promise;
    }];

此函数只会在 Configuration 上运行一次。无论LocalStorage如何,承诺一旦解决,将继续解析为相同的值。每次你

resolve: { authenticated: authenticated }

您将在 Configuration 步骤取回 authenticated 值。

相反,添加一个控制器来定义函数来请求每种类型的状态

  .controller('AuthenticationController', function($scope, '$q', Auth, '$rootScope') {
        $scope.authenticated = function () { 
            var deferred = $q.defer();
            if (typeof window.localStorage['authtoken'] === 'undefined') {
                var authtoken = undefined;
            } else {
                var authtoken = window.localStorage['authtoken'];
            }
            Auth.isLoggedIn(authtoken).then(function() {
                deferred.resolve();
            }, function() {
                deferred.reject();
            });
            return deferred.promise;
        };

        $scope.authGuest = function ($scope, '$q', Auth, '$rootScope') { 
            ....
            return deferred.promise;
        };

    });

然后,在您的路由配置中:

        .state('login', {
            url: '/login',
            templateUrl: 'pages/templates/login.html',
            controller: 'AuthenticationController'
            resolve: { authenticated: $scope.authGuest() }
        })
        .state('cloud', {
            url: '/cloud',
            templateUrl: 'pages/templates/cloud.html',
            resolve: { authenticated: $scope.authenticated()}
        })

现在,每次你都在解决一个新的承诺。

免责声明:没有可用的工作版本,我编写了此代码用于演示目的。它应该被视为一个伪代码以引导正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2021-10-20
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多