10 digest()迭代在登录过程中达到错误

时间:2015-04-21 12:47:15

标签: javascript angularjs events angular-digest

这是我在我的应用程序中实现登录过程的代码。应用程序必须验证服务器设置的cookie,并通过将用户重定向到画布状态继续登录过程。我的问题是我得到了上面提到的错误。实际上它的工作原理是登录成功,但我想摆脱这个错误。我猜错误应该在$ stateChangeStart中,但我不知道如何修复它。任何想法?

(function() {
  'use strict';

  angular
    .module('app', [
      'ui.router',
      'ngResource',
      'ngCookies',
      'app.login'
    ])
    .config(function($stateProvider, $urlRouterProvider){
      $urlRouterProvider.otherwise('/login');
    })
    .run(function($rootScope, AuthService, RedirectService) {
      $rootScope.$on('$stateChangeStart', function(event, toState) {
        if (!AuthService.isAuthenticated()) {
          // the user isn't authenticated
          event.preventDefault();
          // redirect to the server side
          RedirectService.redirectToAuth();
        }
      });
    });
})();




(function() {
  'use strict';

  angular
    .module('app.login')
    .factory('AuthService', Auth);

  Auth.$inject = ['Cookie', 'Session'];

  function Auth(Cookie, Session) {

    return {
      login: function(params) {
        // here set the session with params passed by the server
        Session.create(params.id, params.data.id, params.data.make, params.data.name);
      },
      isAuthenticated: function() {
        // check cookie here set in the server side
        return Cookie.exist();
      }
    };

  }

})();


(function() {
  'use strict';

  angular
    .module('app.login')
    .service('Cookie', Cookie);

  Cookie.$inject = ['$cookies'];

  function Cookie($cookies) {

    this.authCookie = $cookies.__cookie;

    this.exist = function() {
      return (this.authCookie ? true : false);
    };
  }
})();

(function() {
  'use strict';

  angular
    .module('app.login')
    .factory('RedirectService', Redirect);

  Redirect.$inject = ['$window'];

  function Redirect($window) {

    return {
      redirectToAuth: function() {
        // redirect the user to the server for auth
        $window.location.href = "http://" + $window.location.host + "/auth/facebook";
      }
    };
  }
})();


(function() {
  'use strict';

  angular
    .module('app.login')
    .controller('LoginController', Login);

  // here inject what function Login needs
  Login.$inject = ['$rootScope', '$scope', '$state', '$stateParams', 'AuthService'];

  function Login($rootScope, $scope, $state, $stateParams, AuthService) {

    var params = {
      id: $stateParams.userid,
      data: {
        id: $stateParams.modelid,
        make: $stateParams.modelmake,
        name: $stateParams.modelname
      }
    };

    $scope.login = function(params) {
      AuthService.login(params);
      // activate the canvas state
      $state.go('canvas');
    };

    // run the login function to set the Session user with data passed by the server
    $scope.login(params);
  }
})();

2 个答案:

答案 0 :(得分:1)

也许这可以帮助更多:

/*
We are using the below urlRouterProvider.otherwise() because of:
https://github.com/angular-ui/ui-router/issues/600
 */
$urlRouterProvider.otherwise(function($injector, $location) {
    var $state = $injector.get('$state');
    $state.go('login');
});

使用此代码,您仍然可以使用otherwise(),使用when()的缺点是其他未知路由不匹配。上面的代码解决了我们所有的无限循环。

答案 1 :(得分:0)

修正了问题

  $urlRouterProvider.otherwise('/login');

导致了所有这个问题。

删除它并替换为when()解决问题