我有以下使用 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
以外的任何值,则用户已登录。