我正在基于以下帖子对路由进行建模:angular ui-router login authentication。
我正在制作cordova phonegap应用程序。我是angularjs的新手,这是一种全新的学习体验,所以我非常感谢任何建议!如果我建立的认证路由错误,请通知我。
我有2个工厂和一个运行方法。我的第一家工厂名为“ principal”,最重要的变量是isFBLoggedIn
。它还具有3个函数的返回值,其中2个是初始化函数,一个是初始化quickblox,另一个是初始化facebook。第三个函数只是解析并返回承诺。
第二个工厂名为“授权”,实际上只是根据变量isFBLoggedIn
是否为true进行重定向。它在名为“ app”的状态下解析,该状态是抽象的父状态。 (它具有菜单模板和菜单控制器,但不确定是否重要)。
run方法仅设置toState
和toStateParams
,然后基于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