正确使用firebaseAuthClient和angularJS的方法

时间:2013-05-07 16:36:20

标签: 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");
        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");
}

现在这很好,工作正常。但它似乎以异步方式工作,例如我的console.log(“tracer”)在auth.login的用户对象之前返回。我知道我可能需要使用promises来完成这项工作并尝试执行以下操作:

var defer = $q.defer();
defer.auth
.then(function() {
    auth.login('password', {
        email: user1,
        password: pass1,
        rememberMe: false
    });
})
.then(function() {
    console.log("tracer");
})

但是我在控制器模块中声明它后没有定义$ q。所以我要做的是

  1. 检查用户是否已登录。
  2. 等到我收到是/否
  3. 如果没有登录。请使用auth.login
  4. 其他用户登录的用户做了其他一些事情
  5. 我想把auth.login函数放在变量auth的else中但是看起来不会起作用。只是试图找出理解如何使其发挥作用的正确逻辑。

3 个答案:

答案 0 :(得分:6)

您不希望每个控制器都有FirebaseAuthClient,但您确实希望在用户的身份验证状态发生变化时提醒所有控制器。

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

尝试这样的事情:

.service('myAuthService', ["$rootScope", function($rootScope) {
    var ref = new Firebase("https://kingpinapp.firebaseio.com");
    this.auth = new FirebaseAuthClient(ref, function(error, user) {
        if (user) {
            $rootScope.$emit("login", user);
        }
        else if (error) {
            $rootScope.$emit("loginError", error);
        }
        else {
            $rootScope.$emit("logout");
        }   
    });
}])
.controller('myCtrl', ["$scope", "$rootScope", "myAuthService", function($scope, $rootScope, myAuthService) {
    $scope.signin = function() {
        var user1 = $scope.cred.user;
        var pass1 = $scope.cred.password;

        myAuthService.auth.login('password', {
            email: user1,
            password: pass1,
            rememberMe: false
        });
    }
    // listen for user auth events
    $rootScope.$on("login", function(event, user) {
        // do login things
        $scope.user = user;
    })
    $rootScope.$on("loginError", function(event, error) {
        // tell the user about the error
    })
    $rootScope.$on("logout", function(event) {
        // do logout things
    })
}])
<button ng-show="user" ng-click="signin()">Sign in</button>

答案 1 :(得分:2)

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

function MyController($scope, $q, angularFire) {
  $scope.signin = ...
}

或者如果您正在使用&#34;正确的&#34;模块语法:

angular.module("MyModule", ["firebase"]).
controller("MyController", ["$scope", "$q", "angularFire", function($scope, $q, aF) {
  $scope.signin = ...
}]);

在此处详细了解角度相关性注入:http://docs.angularjs.org/guide/di,并查看https://gist.github.com/sbrekken/5151751以获取使用延迟的Firebase身份验证示例。

答案 2 :(得分:0)

我已经在FACTORY: get current user.id for Firebase Simple Login (Email / Password)

发布了这个问题的答案

这是解决这个问题的一个非常可靠的解决方案,可能正是您正在寻找的。