我有一个firebase Auth工厂,如下所示
app.factory("Auth", ["$firebaseAuth", "FIREBASE_URL","$ionicPlatform",
function($firebaseAuth, FIREBASE_URL, $ionicPlatform) {
var auth = {};
$ionicPlatform.ready(function(){
var ref = new Firebase(FIREBASE_URL);
auth = $firebaseAuth(ref);
});
return auth;
}
]);
我在我的ui-router解析中注入Auth工厂作为依赖关系,但是在配置ui-router时,auth为空,因为平台准备就绪后开始。
app.config(function ($stateProvider, $urlRouterProvider) {
$stateProvider
.state('menu', {
url: '/menu',
abstract:true,
cache: false,
controller: 'MenuCtrl',
templateUrl: 'templates/menu.html',
resolve: {
auth: function($state, Auth){
//<--Auth is empty here when the app starts ----->
return Auth.$requireAuth().catch(function(){
$state.go('login'); //if not authenticated send back to login
});
}
}
})
如何确保Auth工厂在注入ui-router之前不为空?
我试过了 -
app.factory("Auth", ["$firebaseAuth", "FIREBASE_URL","$ionicPlatform",
function($firebaseAuth, FIREBASE_URL, $ionicPlatform) {
return $ionicPlatform.ready(function(){
var ref = new Firebase(FIREBASE_URL);
return $firebaseAuth(ref);
});
}
]);
但这会返回一个承诺,使其使用起来更加复杂。
编辑: 我在工厂使用promises来解决问题
app.factory("Auth", ["$firebaseAuth", "FIREBASE_URL","$ionicPlatform","$q",
function($firebaseAuth, FIREBASE_URL, $ionicPlatform, $q) {
var auth = {};
return {
getAuth : function(){
var d = $q.defer();
$ionicPlatform.ready().then(function(){
var ref = new Firebase(FIREBASE_URL);
auth = $firebaseAuth(ref);
d.resolve(auth);
});
return d.promise;
}
};
}
]);
这有效,但我正在寻找更好的解决方案。
答案 0 :(得分:5)
你不能返回{}
然后期望它神奇地成为$firebaseAuth
实例,后来在异步函数中设置。有关异步教育,请参阅this question。
// "points" the x variable to object A
var x = {};
// "points" the x variable to an instance of $firebaseAuth()
// but not before {} is returned from the function
x = $firebaseAuth(...)
如果你想在运行解析功能之前等待平台准备就绪,那么只需链接承诺;这几乎是承诺的重点。
app.factory('IonicReady', function($q, $ionicFramework) {
return $q(function(resolve, reject) {
$ionicPlatform.ready(resolve);
});
});
然后在你的决心中:
resolve: {
auth: function($state, Auth, IonicReady){
return IonicReady
.then(function() {
return Auth.$requireAuth();
})
.catch(function(e) {
console.error(e);
$state.go('login');
});
}
}
不是一个离子专家,这简单地提出了一个问题:为什么在Ionic准备好之前根本没有引导Angular?为什么Angular在加载Ionic时不会自动引导?在平台准备好支持这一点并从门控简化过程之前,不执行任何路由似乎更合适。我不知道如何执行该部分,但似乎它解决了X rather than the Y。
答案 1 :(得分:0)
请务必查看https://www.firebase.com/docs/web/libraries/angular/guide/user-auth.html
上的官方Firebase文档和示例 resolve: {
// controller will not be loaded until $waitForAuth resolves
// Auth refers to our $firebaseAuth wrapper in the example above
"currentAuth": ["Auth", function(Auth) {
// $waitForAuth returns a promise so the resolve waits for it to complete
return Auth.$waitForAuth();
}]
}
您的Auth工厂可以看起来像这样
app.factory("Auth", ["$firebaseAuth",
function($firebaseAuth) {
var ref = new Firebase("https://docs-sandbox.firebaseio.com");
return $firebaseAuth(ref);
}
]);
不依赖于离子平台本身。