我正在使用用户身份验证构建angular + firebase应用程序(使用angularfire 0.8)。
我需要使用onAuth()auth事件处理程序,因为我将提供多个身份验证路径,包括社交,并希望避免代码重复。在onAuth回调中,我需要将location.path重置为' /'。
通常一切都运行良好,但是,如果在已经过身份验证的会话中加载应用程序(例如,< F5> ),则在$scope.$apply()
上我得到&#34 ;错误:[$ rootScope:inprog] $申请已在进行中"
(如果我不使用$ scope。$ apply(),则位置路径不适用于范围,并且不会发生页面更改。)
我怀疑我犯了一些愚蠢的错误,但无法识别它......
这是我的工作流程:
app.controller('AuthCtrl', function ($scope, $rootScope, User) {
var ref = new Firebase(MY_FIREBASE_URL);
$scope.init = function () {
$scope.users = [];
User.all.$bindTo($scope, 'users').then(function () {
console.info('$scope.users bound:', $scope.users);
});
};
$scope.login = function () {
ref.authWithPassword({
email: $scope.user.email,
password: $scope.user.password,
}, function(err) {
if (err) {
console.error('Error during authentication:', err);
}
});
};
ref.onAuth(function(authData) {
if (authData) {
console.info('Login success');
var $rootScope.currentUser = $scope.users[authData.uid];
$location.path('/');
$scope.$apply();
} else {
console.info('Logout success');
}
});
};
app.factory('User', function ($firebase) {
var ref = $firebase(new Firebase(MY_FIREBASE_URL + 'users'));
return {
all: ref.$asObject()
};
});
答案 0 :(得分:1)
作为参考,我想发布我找到的解决方案,我现在正在采用:
$scope.init = function () {
$scope.params = $routeParams;
$scope.debug = CFG.DEBUG;
$scope.lastBuildDate = lastBuildDate;
$scope.error = null;
$scope.info = null;
$scope.users = [];
User.all.$bindTo($scope, 'users').then(function () {
// watch authentication events
refAuth.onAuth(function(authData) {
$scope.auth(authData);
});
});
...
};
...
即,将来自回调内部的身份验证事件的监视移动到来自Firebase的用户对象上的bindTo
就足够了。