Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ui路由器上更改状态时angularjs infdig错误(带视频)_Javascript_Html_Angularjs_Angularjs Scope_Angular Ui Router - Fatal编程技术网

Javascript 在ui路由器上更改状态时angularjs infdig错误(带视频)

Javascript 在ui路由器上更改状态时angularjs infdig错误(带视频),javascript,html,angularjs,angularjs-scope,angular-ui-router,Javascript,Html,Angularjs,Angularjs Scope,Angular Ui Router,新建编辑:检查登录名的authservice: 更新: 不幸的是,这是整个web应用程序的一部分,所以我无法将其上传到JSFIDLE上。我制作了一个youtube视频,在那里我在调试应用程序时准确地显示了错误。从1:30分钟开始出现问题。请随意查看视频 下面是我的angular应用程序的app.js 我在模板中输入的$watch(es)会产生错误吗 Youtube,1:30后开始出错: 首次加载站点时,登录屏幕将加载并请求凭据 如果用户登录,它将重定向到part4页面(从登录控制器内部),到目前

新建编辑:检查登录名的authservice:

更新:
不幸的是,这是整个web应用程序的一部分,所以我无法将其上传到JSFIDLE上。我制作了一个youtube视频,在那里我在调试应用程序时准确地显示了错误。从1:30分钟开始出现问题。请随意查看视频
下面是我的angular应用程序的app.js

我在模板中输入的$watch(es)会产生错误吗

Youtube,1:30后开始出错

首次加载站点时,登录屏幕将加载并请求凭据

如果用户登录,它将重定向到part4页面(从登录控制器内部),到目前为止一切正常

问题是,每当我在浏览器上打开新选项卡时,尝试加载网站:

  • 它应该看到用户已经登录并在part4页面上重定向他

  • 与此相反,正如我在浏览器调试中看到的,它转到了resolve:login

  • 然后它在
    $rootScope.$on(“$stateChangeError”,
    中上升,并进入
    go.state(第4部分)

  • 然后转到第4部分的解析,然后转到登录的解析,再次转到$statechangeerror函数

  • 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');
        });
    

    我在youtube上上传了一段视频,描述并显示了错误:
    youtube:

    你能试试这个吗

    .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在每个路由的解析中始终检查用户的问题。in.config()set
    authService.user=$cookieStore.get('user'))
    某个地方。应该解决您的问题。

    我认为状态首先得到解决,因为您在应用程序中注入了$state.run

    这会导致尝试使用未定义的用户解析part4状态的resolve,然后引发该事件,并将在下一个摘要周期中解析,因此在您获得ReDirecent to login页面之前,该用法已初始化,这将重定向到part4

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

    如果还不够:拆分您的模块:在模块“a”中包含authService的模块与专用的angular.module('a')。运行,在模块“B”中包含authService的模块与angular.module('B')之间存在依赖关系。运行$stateChangeError

    一切正常。 经过许多小时和许多断点,我意识到问题不是由任何
    $watch()
    引起的,我的控制器上有许多
    $watch

    这只是一个状态问题,正如你在我的问题上看到的,我没有'/'状态,这导致了无限循环,因为:

  • 当我删除url的扩展部分时,我有:www.mydomain.com/,然后
    $stateProvider
    搜索我可用的“状态”,但找不到“/”状态,因此它重定向到“登录”状态
  • 进入“登录”状态时,我检查user==true并拒绝错误
  • 然后,$rootScope.$on(“$stateChangeError”){..}执行,我调用state.go('part4'),它解析状态“part4”,然后再次转换为状态“login”resolve,直到达到$digest循环允许的最大迭代次数为止
  • 我是怎么解决的 我不知道这是否是最好的方法,但我在app.js上添加了一个“/”状态,它的工作原理与预期一致:

    .state('/', {
                    url: '/',
                    controller: 'LoginCtrl',
                    templateUrl: '/assets/modules/login/login.html',
                    resolve: {
                        user: ['authService', '$q', function (authService, $q) {
                            if (authService.user) {
                                return $q.reject({authorized: true, user: authService.user});
                            }
                        }]
                    }
                });
    

    我对你的
    app.js
    有点困惑。我很确定它应该是
    app.run…
    而不是
    angular.module('MainApp')。使用
    angular.module('MainApp')运行
    @LJ.Wizard)
    是一种更好的做法。它不依赖于设置全局变量,在不知道如何授权的情况下很难提供帮助works@charlietfl我明白了。谢谢。你陷入了一个无限循环。当你被路由到part4状态时,你能得到一个
    错误吗?授权的
    ?是$stateChangeError而不是$stateChangeStart,否则他是navig除了第4部分和登录:Pyes,我希望@theo itzaris使用
    $stateChangeStart
    和初始化配置中的
    authService.user=$cookieStore.get('user');
    ,来处理身份验证和url更改。我正以另一种方式处理。这里不需要$q。
    .state('/', {
                    url: '/',
                    controller: 'LoginCtrl',
                    templateUrl: '/assets/modules/login/login.html',
                    resolve: {
                        user: ['authService', '$q', function (authService, $q) {
                            if (authService.user) {
                                return $q.reject({authorized: true, user: authService.user});
                            }
                        }]
                    }
                });