所以我在这里关注firebase doc authentication with Routers。相反,我使用Ionic / ui-router并具有抽象视图和带控制器的实际视图。结构如下:
.state('auth', {
url: "/auth",
abstract: true,
templateUrl: "app/auth/auth.html",
resolve: {
"currentAuth": ["Auth", function(Auth){
// $waitForAuth returns a promise so the resolve waits for it to complete
return Auth.$waitForAuth();
}]
}
})
.state('auth.signin', {
url: '/signin',
views: {
'auth-signin': {
templateUrl: 'app/auth/auth-signin.html',
controller: 'SignInCtrl'
}
}
})
.state('home', {
cache: false,
abstract: true,
url: "/home",
templateUrl: "app/home/home.html",
controller: 'homeTabCtrl',
resolve: {
"currentAuth": ["Auth", function(Auth){
// $requireAuth returns a promise so the resolve waits for it to complete
// If the promise is rejected, it will throw a $stateChangeError (see above)
return Auth.$requireAuth();
}]
}
})
.state('home.courses', {
cache: false,
url: "/courses",
views: {
"tab-courses": {
templateUrl: "app/home/courses.html",
controller: "courseCtrl"
}
}
})
所以它运作正常。当我没有登录进入home.courses时,我重定向到auth.signin。但我想在SignInCtrl中获取currentAuth返回对象/ promise。因此,当用户登录时,如果他们进入auth.signin状态,则会将其重定向到home.courses。我按照doc指令将currentAuth注入控制器,如下所示:
(function () {
'use strict';
angular.module("myApp").controller('SignInCtrl', ['currentAuth', '$scope', '$rootScope', SignInCtrl]);
function SignInCtrl(currentAuth, $scope, $rootScope){
console.log (currentAuth);
}
})();
抛出错误:
错误:[$ injector:unpr]未知提供者:currentAuthProvider< - currentAuth< - SignInCtrl
我做了与docs示例相同的事情并尝试获取currentAuth promise对象(为了使用if语句将用户重定向到home.courses,如果currentAuth不为NULL)。但它不起作用:(请帮助firebase团队。
更新
根据加藤的说法,我将无法访问currentAuth承诺。那么,如果用户已经在路由/ auth / signin /并将它们重定向到/ home / courses / route,那么查看用户是否已经登录的常规方法是什么?
答案 0 :(得分:1)
错误非常有用;这是路由101,已经在Stack Overflow上覆盖了数十次。这里的关键是理解currentAuth
不是服务或模块(您试图将其作为模块和服务包含在此处),但在调用特定路由时由resolve方法注入。
/signin
路径无法使用 currentAuth,因为该路由没有resolve
。由于这个决心,它可用于“家庭”路线:
resolve: {
"currentAuth": ["Auth", function(Auth){
因此,您不能在/ signin中使用该数据,除非您还为在其中注入它的路由创建了解决方案,这应该是多余的,因为如果authData为null,则只将它们发送到/ signin。