Return 来自 angular 工厂,当 ionic 平台准备就绪时
Return from angular factory when ionic platform ready
我有一个 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);
});
}
]);
但是这个 returns 承诺使得使用起来更加复杂。
编辑:
我在 factory 中使用了 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;
}
};
}
]);
这可行,但我正在寻找更好的解决方案。
一定要查看 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);
}
]);
不依赖离子平台本身。
您不能 return {}
然后期望它神奇地成为 $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(...)
如果您想等到平台准备就绪之后再使用 resolve 函数 运行,那么只需将 promise 链接起来即可;这几乎就是承诺的重点。
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 专家,这只是在回避问题:为什么 bootstrap Angular 在 Ionic 准备好之前?为什么在加载 Ionic 时 Angular 没有自动 bootstrapped?在平台准备好支持这一点并从门开始简化流程之前,不执行任何路由似乎更合适。我不知道如何执行那部分,但它似乎解决了 X rather than the Y.
我有一个 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);
});
}
]);
但是这个 returns 承诺使得使用起来更加复杂。
编辑: 我在 factory 中使用了 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;
}
};
}
]);
这可行,但我正在寻找更好的解决方案。
一定要查看 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);
}
]);
不依赖离子平台本身。
您不能 return {}
然后期望它神奇地成为 $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(...)
如果您想等到平台准备就绪之后再使用 resolve 函数 运行,那么只需将 promise 链接起来即可;这几乎就是承诺的重点。
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 专家,这只是在回避问题:为什么 bootstrap Angular 在 Ionic 准备好之前?为什么在加载 Ionic 时 Angular 没有自动 bootstrapped?在平台准备好支持这一点并从门开始简化流程之前,不执行任何路由似乎更合适。我不知道如何执行那部分,但它似乎解决了 X rather than the Y.