使用firebaseAuthClient和angularJS的正确方法
一直在和firebase和angularjs玩,只是想把一些小东西放在一起。我现在让auth在控制器中工作,在登录按钮上调用此功能单击:使用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");
$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的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,但是我不知道该代码将在哪里实现。是否在服务中?如果您能提供最简单的工作示例,我们将不胜感激-提前感谢