更改ui-router状态时的angularjs infdig错误(带视频)

时间:2016-02-25 21:15:40

标签: javascript html angularjs angularjs-scope angular-ui-router

新编辑: 检查登录的authservice

'use strict';

angular.module('MainApp.login.services', [])
    .factory('authService', ['AUTH_ENDPOINT', 'LOGOUT_ENDPOINT', '$http', '$cookieStore', function (AUTH_ENDPOINT, LOGOUT_ENDPOINT, $http, $cookieStore) {
        var auth = {};
        auth.login = function (username, password) {
            return $http.post(AUTH_ENDPOINT, {username: username, password: password})
                .then(function (response, status) {
                    auth.user = response.data;
                    $cookieStore.put('user', auth.user);
                    return auth.user;
                });
        };
        auth.logout = function () {
            return $http.post(LOGOUT_ENDPOINT).then(function (response) {
                auth.user = undefined;
                $cookieStore.remove('user');
                $cookieStore.remove('event');
            });
        };
        return auth;
    }])
    .value('AUTH_ENDPOINT', 'http://www.mydomain.gr/assets/modules/login/dal/login.php')
    .value('LOGOUT_ENDPOINT', 'http://www.mydomain.gr/assets/modules/login/dal/logout.php');  

更新:
不幸的是,这是整个网络应用程序的一部分,所以我无法将其上传到jsfiddle。我制作了一个YouTube视频,我在调试应用程序时显示错误。从分钟1:30开始问题。随意检查视频
下面是我的角度应用程序的 app.js

我在模板中看到的$ watch会产生错误吗?

Youtube,1:30后启动错误https://www.youtube.com/watch?v=3Cc2--BkdQ4&feature=youtu.be

首次加载网站时,会加载登录屏幕并要求提供凭据。

如果用户登录,它会重定向到part4页面(从登录控制器内部),到目前为止一直很好!

问题是每当我在浏览器上打开一个新标签时,尝试加载网站:

  1. 应该看到用户已经进入并在第4页上重定向他。

  2. 而不是这个,正如我在浏览器的调试中看到的,它转到了解决方案:登录

  3. 然后它会升到$rootScope.$on('$stateChangeError',内部和go.state(part4)

  4. 然后它转到part4的解析然后它进入登录的解析并再次转到$ statechangeerror函数

  5. 5.最后我收到错误:Error: [$rootScope:infdig] http://errors.angularjs.org/1.4.8/$rootScope/infdig?p0=10&p1=%5B%5D 但奇怪的是,它最终重定向到part4页面,但是有了这个错误!!

    任何人都可以帮助我。

    'use strict';
    
    var app = angular.module('MainApp', ['mApp',
        'MainApp.loginModule',
        'MainApp.part4Module',
        'MainApp.part5Module',
        'MainApp.eventModule',
        'ui.router', 'ui.router.tabs', 'ngCookies']);
    
    angular.module('MainApp')
        .run(['$rootScope', '$state', '$cookieStore', 'authService', function ($rootScope, $state, $cookieStore, authService) {
            $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
                if (error.unAuthorized) {
                    $state.go('login');
                }
                else if (error.authorized) {
                    $state.go('part4');
                }
            });
    
            authService.user = $cookieStore.get('user');
        }])
        .config(function ($stateProvider, $urlRouterProvider, $locationProvider) { //$stateProvider & $urlRouterProvider are from ui.router module
            $stateProvider
                .state('floorplan', {
                    url: '/floorplan/:activeEventId/:activeHallId/:activeHallVariant',
                    controller: 'ParticipantsCtrl',
                    templateUrl: '/assets/modules/part1/part1.html',
                    resolve: {
                        user: ['authService', '$q', function (authService, $q) {
                            return authService.user || $q.reject({unAuthorized: true});
                        }]
                    }
                })
                .state('event', {
                    url: '/event/:activeEventId',
                    templateUrl: 'assets/modules/event/eventPartial.html',
                    controller: 'eventctrl',
                    resolve: {
                        user: ['authService', '$q', function (authService, $q) {
                            return authService.user || $q.reject({unAuthorized: true});
                        }]
                    }
                })
                .state('part4', {
                    url: '/part4',
                    resolve: {
                        user: ['authService', '$q', function (authService, $q) {
                            return authService.user || $q.reject({unAuthorized: true});
                        }]
                    },
                    controller: 'part4ctrl',
                    templateUrl: '/assets/modules/part4/part4Partial.html'
                })
                .state('login', {
                    url: '/login',
                    controller: 'LoginCtrl',
                    templateUrl: '/assets/modules/login/login.html',
                    resolve: {
                        user: ['authService', '$q', function (authService, $q) {
                            if (authService.user) {   
                             return $q.reject({authorized: true});
                            }
                        }]
                    }
                });
            $urlRouterProvider.otherwise('login');
        });
    

    enter image description here

    我在YouTube上传了一段视频,描述并显示错误: youtube:https://www.youtube.com/watch?v=3Cc2--BkdQ4&feature=youtu.be

2 个答案:

答案 0 :(得分:3)

我认为状态首先得到解决,因为你在app.run中注入$ state。

导致尝试使用未定义的用户解决part4状态的解析,然后抛出该事件并在下一个摘要周期解析,因此在重定向到登录页面之前初始化使用,会将你重定向到第4部分。

尝试将两个angular.run分开,第一个将运行authService的init而不注入$ state。第二个将注入$ state以初始化$ stateCHangeError侦听器(仅在第二个之前定义第一个)。

如果还不够:拆分您的模块:在模块中包含authService的模块' A'使用专用的angular.module(' A')。运行,模块中的第2个' B'依赖于' A'使用angular.module(' B')。运行$ stateChangeError

答案 1 :(得分:2)

你可以试试这个吗?

.run(['$rootScope', '$state', '$cookieStore', 'authService', function ($rootScope, $state, $cookieStore, authService) {
    $rootScope.$on('$stateChangeStart', function (...) {
    authService.user = $cookieStore.get('user');
                if (authService.user) {
                    $state.go('part4');
                }
                else if (!authService.user) {
                    $state.go('login');
                }
            });
}

这将在每个路线的声明中跳过你决心内的$ q来回。其次,这也将解决您/ r在每条路线的决心内一直检查用户的问题。在.config()中设置authService.user = $cookieStore.get('user');。应该解决你的问题。