我正在基于以下帖子对路由进行建模:angular ui-router login authentication

我正在制作cordova phonegap应用程序。我是angularjs的新手,这是一种全新的学习体验,所以我非常感谢任何建议!如果我建立的认证路由错误,请通知我。

我有2个工厂和一个运行方法。我的第一家工厂名为“ principal”,最重要的变量是isFBLoggedIn。它还具有3个函数的返回值,其中2个是初始化函数,一个是初始化quickblox,另一个是初始化facebook。第三个函数只是解析并返回承诺。

第二个工厂名为“授权”,实际上只是根据变量isFBLoggedIn是否为true进行重定向。它在名为“ app”的状态下解析,该状态是抽象的父状态。 (它具有菜单模板和菜单控制器,但不确定是否重要)。

run方法仅设置toStatetoStateParams,然后基于isFBLoggedIn进行路由。我不确定是否需要在这里放置路线,但我以为可以,因为我相信工厂只会运行一次...

所以我的变量isFBLoggedIn不确定,我无法弄清楚原因。我已经在我的代码中对其进行了初始化...

我尝试从该链接复制尽可能多的代码,因为我对angularjs ui不太熟悉。但是,如果您认为有更好的方法可以进行身份​​验证,请告诉我。我很想第一次而不是第十次正确地做事...

我已经坐了很久/看着这个,所以希望能得到一些帮助...我在做什么错?

编辑以添加:除了isFBLoggedIn变量显示为未定义之外,当我在浏览器中输入需要登录的页面的URL时,我看到浏览器中的URL更改为/login(这是我想要/期望的) )。但是,实际视图不会改变。我遇到了这个link,它似乎也有同样的问题。但是我不明白他们在说什么是问题...

运行方法

.run(['$rootScope','$state','$stateParams','principal','authorization',function($rootScope,$state,$stateParams,principal,authorization){

    $rootScope.$on('$stateChangeStart',function(event,toState,toParams,fromState,fromParams){
      $rootScope.toState = toState;
      $rootScope.toStateParams = toParams;

      // if logged in and going to login page, redirect to cards page
      if (principal.isFBLoggedIn && toState.name === 'app.login'){
        $state.go('app.cards');
      } else if (!principal.isFBLoggedIn && toState.name != 'app.login') {
        // not logged in and not going to login page, redirect to login page.
        $state.go('app.login');
      } else {
           // this is theoretically all fine but that's not true
           // because things are being routed here because isFBLoggedIn is showing undefined.
      }

    });
  }])


主体工厂

  .factory('principal',['$q','$timeout',function($q,$timeout){
    isFBLoggedIn = false;
    return {
      QBInit: function(){
        QB.init(CONFIG.application_id, CONFIG.authKey, CONFIG.authSecret, CONFIG.debug);
        QB.createSession(function(err, result) {
          if (err){
            return $q.reject("QB Create Session Error");
          } else {
            return result.token;
          }
        });
      },
      FBInit: function(){

        if (!window.cordova) {
          // first check if fb is defined and run browser init and get login status if successful
          checkFBDefined(function(){
            facebookConnectPlugin.browserInit(1506810102869030,"v2.0");
            facebookConnectPlugin.getLoginStatus(
              function(res){
                if (typeof(res) != 'undefined' && res.status === 'connected'){
                  this.isFBLoggedIn = true;
                }
                return res;
              },
              function(err){return $q.reject('getLoginStatus Error: ' + err);
            });
          },0,$timeout);

        } else {
            facebookConnectPlugin.getLoginStatus(
              function(res){
                if (typeof(res) != 'undefined' && res.status === 'connected'){
                  this.isFBLoggedIn = true;
                }
                return res;
              },
              function(err){return $q.reject('getLoginStatus Error: ' + err);
            });
        }
      },
      initialization: function(){
        var deferred = $q.defer();
        var promise = deferred.promise.then(this.QBInit).then(this.FBInit);
        deferred.resolve();
        return promise;
      }
    }
  }])


授权工厂

  .factory('authorization',['$rootScope','$state','principal',function($rootScope,$state,principal){
    return {
      authorize: function(){
        return principal.initialization().then(function(){
          if (principal.isFBLoggedIn && $rootScope.toState.name == 'app.login'){
            // logged in, but going to login page, redirect to cards page
            $state.go('app.cards');
          } else if (!principal.isFBLoggedIn && $rootScope.toState.name !='app.login'){
            // not logged in and not going to login page, redirect to login page.
            $rootScope.returnToState = $rootScope.toState;
            $rootScope.returnToStateParams = $rootScope.toStateParams;
            $state.go('app.login');
          } else {
            console.log("routes should be fine but isn't because isFBLoggedIn is undefined");
          }

        });
      }
    }
  }])


解决授权工厂的位置:

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

      .state('app', {
        url: "/app",
        abstract: true,
        templateUrl: "templates/menu.html",
        resolve:{authorize: ['authorization',function(authorization){
            return authorization.authorize();
            }]
        },
        controller: 'MenuCtrl'
      })

最佳答案

您将isFBLoggedIn = false;初始化为全局变量,并且未绑定到您注入principal的工厂app.run

尝试这个:

.factory('principal',['$q','$timeout',function($q,$timeout){
  var isFBLoggedIn = false;
  return {
    isFBLoggedIn: isFBLoggedIn,
    QBInit: function(){ // rest of code

07-26 07:31