AuglarFire使用路由器进行身份验证会丢弃未知的提供程序错误

时间:2015-06-19 18:10:42

标签: javascript angularjs firebase angularfire

所以我在这里关注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,那么查看用户是否已经登录的常规方法是什么?

1 个答案:

答案 0 :(得分:1)

错误非常有用;这是路由101,已经在Stack Overflow上覆盖了数十次。这里的关键是理解currentAuth不是服务或模块(您试图将其作为模块和服务包含在此处),但在调用特定路由时由resolve方法注入。

因此,/signin路径无法使用 currentAuth,因为该路由没有resolve。由于这个决心,它可用于“家庭”路线:

  resolve: {
    "currentAuth": ["Auth", function(Auth){

因此,您不能在/ signin中使用该数据,除非您还为在其中注入它的路由创建了解决方案,这应该是多余的,因为如果authData为null,则只将它们发送到/ signin。