我有以下使用AngularFire的控制器
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
函数绑定到ng-click
事件并单击绑定按钮时,console.log("found me")
在浏览器中运行,但$scope.createAccount
中的其他console.log
命令均未显示。
设置$scope.createAccount
函数之前的console.log($scope.auth)
命令显示了定义了$createUser
函数的有效对象。
当我运行$scope.createAccount
时,我没有收到任何控制台错误,所以我假设调用已经"成功"进行。
为什么我可以看到auth对象,但在调用$createUser
后没有收到回调?
之所以会发生这种情况,是因为我是基于JavaScript而不是Angular的标记来做回调的。由于我使用的是AngularFire方法(它们的名称与普通JavaScript SDK方法相同,但在它们前面有一个$
标志),我需要使用Angular的$promise
方法来处理回调。
I changed
$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
});
和回调按预期工作。
在JS的firebaseSimpleLogin
构造函数和Angular的$firebaseSimpleLogin
构造函数之间有一个例外。在普通的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中,你有数据绑定,你可以简单地$watch
$scope.auth.user
进行更改,并根据变量的状态在你的应用程序中执行操作。当"$scope.auth.user
"设置为"null
"时,表示注销该用户。如果该值设置为null
以外的任何值,则用户登录。