javascript - $state 或 $location 更改时 Angular ui.router 无限循环

标签 javascript angularjs angularjs-scope angular-ui-router eventemitter

在过去的 4 个小时里,我已经筋疲力尽了,我一直在尝试调试并在整个互联网上阅读这可能是什么问题。

所以,我正在模拟一个移动应用程序,我的逻辑是这样的:

  1. 如果用户过去登录过,我们在 localStorage 中有相关数据,然后向他显示列表。这是离线
  2. 如果我们连接到互联网,首先显示列表并在后台检查他是否仍然登录
  3. 如果他不是,则重定向到登录页面。

在主主页 View 上,我正在评估上述语句,如果他有 localStorage 数据,首先我会向他显示列表,然后我在线检查并在必要时重定向到登录。

每当我有两个 $state 或 $locations 时,它就会循环。就像浏览器几乎死机一样,幸运的是它是 Chrome。我得到了 Cannot call method 'insertBefore' of null。根据我的阅读,一个已知的 angular.ui 路由器问题,如果使用不当或其他一些神秘的问题。

一些代码:

这些事件发射器和接收器,我在我的状态管理服务的返回中调用它们

//Notification Helpers, also exposed, to keep them in the same scope tree.
        function emitNotification (event, data) {
            console.log('Emitting event: ' + event);
            $rootScope.$emit(event, data);

        }

        function emitListen (event, fn) {
            console.log('Listening for: ' + event);
            $rootScope.$on(event, function (e, data) {
                fn(data);
            });

        }

. . .逻辑

//Update the userData in localStorage and in .value
                                $auth.storage.set('userData', data);
                                userData = $auth.storage.get('userData'); //TODO: Redundant, store it directly, is it ok?

                                emitNotification('event:auth-okServer', data);
                                //return 'ok-server';

...返回我的服务

},
            loginSuccess: function(data){
                emitNotification('event:auth-loginSuccess', data);
            },
            loginFailed: function(data){
                emitNotification('event:auth-loginFailed', data);
            },
            notify: emitNotification,
            listen: emitListen

这是在我的 Controller 中:

.config(function config($stateProvider) {
        $stateProvider
            .state('sidemenu.home', {
                url: '/home',
                views: {
                    'topView': {
                        controller: 'HomeCtrl',
                        templateUrl: 'home/home.tpl.html'
                    }
                }
            })
            .state('sidemenu.home.list', {
                url: '/list',
                templateUrl: 'home/home-list.tpl.html',
                controller: 'ListCtrl'
            })
            .state('sidemenu.home.login', {
                url: '/login',
                templateUrl: 'home/home-login.tpl.html',
                controller: 'LoginCtrl'
            })
            .state('sidemenu.home.register', {
                url: '/register',
                templateUrl: 'home/home-register.tpl.html',
                controller: 'RegisterCtrl'
            })
            .state('sidemenu.home.coach', {
                url: '/coach',
                templateUrl: 'home/home-coach.tpl.html',
                controller: 'CoachCtrl'
            })
            ;
    })

    .controller('HomeCtrl', function HomeController($scope, $state, $location, localState) {

        /**
         * EVENT EMITTERS
         * @event:auth-loginSuccess - Login has been succesfull, let everybody know.
         * @event:auth-loginFailed  - Login has failed, do something.
         * @event:auth-okServer     - Server challenge ok, user is logged in.
         * @event:auth-okLocal      - Local challenge ok, user appears to be logged in.
         * @event:auth-login        - Go to login
         * @event:general-coach     - Start the coach
         **/


        /**
         * ===== FIRST LOGIC =====
         **/


        //We are placing emitters in the same children-parent tree scope, the one from localState, and we're listening to them.
        localState.listen('event:auth-okLocal', function(data) {
            console.log('EVENT: auth-okLocal has been triggered');
            //$state.transitionTo('sidemenu.home.list');
            $location.path('/sidemenu/home/list');
            //First we will be redirected on listpage
        });

        localState.listen('event:auth-login', function() {
            console.log('EVENT: auth-login has been triggered');
            $location.path('/sidemenu/home/login');
        });
        //Server check fails, redirect to login
        localState.listen('event:general-coach', function(data) {
            console.log('EVENT: general-coach has been triggered');
            //$state.transitionTo('sidemenu.home.coach');
            $location.path('/sidemenu/home//coach');
        });

        //After we have all the listeners in place do the checking & broadcasting.
        localState.check();

我做错了什么?

我调试了发射器,我的 check() 函数创建了所有发射器,我在 ui.router 上尝试了几种组合,但我都失败了:)。

最佳答案

我在相同的用例中遇到了同样的问题,这是 ui 路由器的一个错误,但是在转换之前等待它完成状态更改解决了它:

if (webAPIAuth.isLoggedIn()) { $scope.$on('$stateChangeSuccess', 函数 () { $state.go('仪表板'); }); }

关于javascript - $state 或 $location 更改时 Angular ui.router 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22887828/

相关文章:

javascript - Angular 服务被注入(inject)到 Controller 中,但它显示为一个空对象

javascript - Date().getTime() JavaScript 转换为 php?

javascript - 我的函数中有一些未定义的东西

javascript - NG-Repeat 生成包含动态类的列表

javascript - 如何创建和下载要从 AngularJS 中的表中的数据创建的 PDF 和 docx 格式的文件?

javascript - UI-Grid 在单元格下拉列表中显示未定义

javascript - 在 Controller 中使用 'var' 声明的变量,但在 Controller 中作为作用域引用

angularjs - Controller 间通信, Angular 方式

javascript - 使用 new Image() 在 JavaScript 中旋转图像

javascript - 打印所有已安装的 node.js 模块的列表