我有以下使用 AngularFire 的 Controller

app.controller("authController", function($scope, $firebaseSimpleLogin){

var ref = new Firebase("https://myapp.firebaseIO.com/");
$scope.auth = $firebaseSimpleLogin(ref, function(error, user){
    if(error){
        console.log(error);
    }
    else if(user){
        console.log(user);
    }
    else{
        console.log("user logged out");
    }
});

// This shows a valid object
console.log($scope.auth);

$scope.createAccount = function(){
    console.log("found me");
    $scope.auth.$createUser($scope.email, $scope.password, function(error, user){
        console.log("something");
        console.log(user);
        if(!error){
            console.log(user);
        }
        else{
            console.log(error);
        }
    });
};

});

当我将 $scope.createAccount 函数绑定(bind)到 ng-click 事件并单击绑定(bind)按钮时,console.log("found me") 在浏览器中运行,但没有显示 console.log 中的其他 $scope.createAccount 命令。

我在设置 console.log($scope.auth) 函数之前使用的 $scope.createAccount 命令显示了一个定义了 $createUser 函数的有效对象。

当我运行 $scope.createAccount 时,我没有收到任何控制台错误,所以我假设调用已经“成功”进行了。

为什么我可以看到 auth 对象,但在调用 $createUser 后没有收到回调?

最佳答案

发生这种情况是因为我正在根据 JavaScript 表示法而不是 Angular 表示法进行回调。由于我使用的是 AngularFire 方法(它们与 vanilla JavaScript SDK 方法具有相同的名称,但前面带有 $ 标志),我需要使用 Angular 的 $promise 方法处理回调。

我变了

$scope.auth.$createUser($scope.email, $scope.password, function(error, user){
    // do things;
});


$scope.auth.$createUser($scope.email, $scope.password)
    .then(function(user){
        // do things if success
    }, function(error){
        // do things if failure
    });

并且回调按预期工作。

上面有一个异常(exception), Vanilla JS firebaseSimpleLogin 构造函数与 Angular $firebaseSimpleLogin 构造函数。在 vanilla JS 构造函数中,构造函数上有回调,允许您指定用户登录/注销时脚本应该执行的操作。它遵循以下格式:
var auth = new firebaseSimpleLogin(ref, function(error, user){
    if(error){
        // do things if login failure
    }
    else if(user){
        // do things when login succeeds
    }
    else{
        // do things when user logs out
    }
});

如果您尝试对 Angular 构造函数执行相同的操作,如下所示:
$scope.auth = $firebaseSimpleLogin(ref)
    .then(function(user){
        // do things when login succeeds
    }, function(error){
        // do things when login fails
    });

你会收到一个错误。 Angular 构造函数没有回调方法。我猜这是故意完成的,因为使用 Angular,你有数据绑定(bind),你可以简单地 $watch $scope.auth.user 进行更改并根据变量的状态在你的应用程序中执行操作。当 $scope.auth.user 设置为 null 时,用户将被注销。如果该值设置为 null 以外的任何值,则用户已登录。

10-08 03:11