使用firebaseAuthClient和angularJS的正确方法

使用firebaseAuthClient和angularJS的正确方法,angularjs,firebase,Angularjs,Firebase,一直在和firebase和angularjs玩,只是想把一些小东西放在一起。我现在让auth在控制器中工作,在登录按钮上调用此功能单击: $scope.signin = function(){ var user1 = $scope.cred.user; var pass1 = $scope.cred.password; var ref = new Firebase("https://kingpinapp.firebaseio.com");

一直在和firebase和angularjs玩,只是想把一些小东西放在一起。我现在让auth在控制器中工作,在登录按钮上调用此功能单击:

$scope.signin = function(){
        var user1 = $scope.cred.user;
        var pass1 = $scope.cred.password;

        var ref = new Firebase("https://kingpinapp.firebaseio.com");
        var auth = new FirebaseAuthClient(ref, function(error, user) {
            if (user) {
                // user authenticated with Firebase
                console.log(user);


            } else if (error) {
                 // an error occurred authenticating the user
                 console.log(error);

                } else {
                // user is logged out
            }   
        });
        auth.login('password', {
            email: user1,
            password: pass1,
            rememberMe: false
        });
        console.log("tracer");
}
现在,这是伟大的,工作良好。但它似乎以异步方式工作,例如my console.log(“tracer”)在auth.login的用户对象之前返回。我知道我可能需要与承诺合作来完成这项工作,并尝试了以下几点:

var defer = $q.defer();
defer.auth
.then(function() {
    auth.login('password', {
        email: user1,
        password: pass1,
        rememberMe: false
    });
})
.then(function() {
    console.log("tracer");
})
但在控制器模块中声明后,我收到的$q未定义。所以我想做的是

  • 检查用户是否已登录
  • 等我收到是/否
  • 如果没有登录。使用auth.login
  • 否则,登录的用户将执行其他操作

  • 我曾想过将auth.login函数放在变量auth的else中,但这似乎不起作用。只是想找出正确的逻辑来理解如何让它工作。

    确保在控制器中包含$q作为依赖项。在简单的情况下:

    函数MyController($scope,$q,angularFire){
    $scope.signin=。。。
    }
    
    或者,如果您使用的是“正确的”模块语法:

    angular.module(“MyModule”,“firebase”])。
    控制器(“MyController”、[“$scope”、“$q”、“angularFire”、函数($scope、$q、aF){
    $scope.signin=。。。
    }]);
    

    在此处了解有关角度依赖项注入的更多信息:,并查看使用延迟的Firebase auth的示例。

    您不希望每个控制器都有一个FirebaseAuthClient,但希望在用户的auth状态更改时通知所有控制器

    FirebaseAuthClient将为您处理会话存储。用户成功登录后,您只需隐藏登录屏幕/按钮

    试着这样做:

    .service('myAuthService',[“$rootScope”,函数($rootScope){
    var ref=新的火基(“https://kingpinapp.firebaseio.com");
    this.auth=新的FirebaseAuthClient(参考,函数(错误,用户){
    如果(用户){
    $rootScope.$emit(“登录”,用户);
    }
    else if(错误){
    $rootScope.$emit(“登录错误”,错误);
    }
    否则{
    $rootScope.$emit(“注销”);
    }   
    });
    }])
    
    .controller('myCtrl'、[“$scope”、“$rootScope”、“myAuthService”、函数($scope、$rootScope、myAuthService){
    $scope.signin=函数(){
    var user1=$scope.cred.user;
    var pass1=$scope.cred.password;
    myAuthService.auth.login('密码'{
    电邮:user1,,
    密码:pass1,
    记住:错
    });
    }
    //侦听用户身份验证事件
    $rootScope.$on(“登录”,函数(事件,用户){
    //做一些登录的事情
    $scope.user=用户;
    })
    $rootScope.$on(“登录错误”,函数(事件,错误){
    //告诉用户错误
    })
    $rootScope.$on(“注销”,函数(事件){
    //做注销的事情
    })
    }])
    
    登录
    
    我已经在这里发布了这个问题的答案


    这是解决此问题的一个非常可靠的解决方案,可能正是您想要的。

    new Firebase(“)自动返回一个承诺,该承诺在您从服务器接收数据时得到解决,因此无需手动使用$qOk,例如我们运行FirebaseAuthClient,检查用户是否登录。如果没有登录,我希望运行auth.login函数。我是否应将auth.login放在else语句中?尝试此操作时,控制台中出现错误@asiammyself FirebaseAuthClient()不检查用户是否已登录!它只设置一个回调,在用户的身份验证状态更改时运行(请参阅:)。换句话说,在调用
    auth.login()
    之前,不会发生任何事情。您的代码看起来正确,您只需将“已登录”的用户放入以执行其他操作“
    if(user){…}
    块中的代码。@作为旁白,$q不起作用的原因可能是您忘记将其注入控制器中。据我所知,Ajay所说的不是真的,但他是对的,如果你不想使用$q,你就不需要使用$q。因此,如果在用户身份验证发生更改时运行FirebaseAuthClient。如果有多个控制器,而不是在每个控制器中放置一个,正确的方法是将FirebaseAuthClient放在工厂中吗?我正在尝试实现上述功能,但我使用的是$routeProvider。服务在控制器之前被触发。我已经看过了deferred方法linked,但是我不知道该代码将在哪里实现。是否在服务中?如果您能提供最简单的工作示例,我们将不胜感激-提前感谢