用户使用用户名、电子邮件和密码进行注册。我使用带有电子邮件的 FirebaseSimpleLogin 进行身份验证,获取用户 ID,然后使用用户 ID 加载我的用户:
var ref = new Firebase(FIREBASE_URL + 'users'); // data containing user information
var users = $firebase(ref);
$rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) { // wait until authenticated
var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid)); // find user by uid
query.$on('loaded', function () {
setCurrentUser(query.$getIndex()[0]); // get username from query
});
});
function setCurrentUser (username) {
$rootScope.currentUser = User.findByUsername(username);
}
现在,我的问题是,如果我在 HomeCtrl 中登录,我想重定向到用户配置文件页面:
app.controller('HomeCtrl', function ($rootScope, $scope, $location, Auth, User) {
// wait for current user to be set
// if signed in
// location.path('/user/' + currentUser.username);
});
不幸的是,我不确定如何在重定向之前等到 setCurrentUser 函数完成。有没有一种方法可以让我的 Controller 中的一个函数等待其他函数完成?
我有一个解决方法,但我很确定这不是正确的方法。现在,我正在观察我的用户变量是否更新,然后在它更改为用户后调用所有函数,如:
$scope.$watch(
function() { return $rootScope.currentUser }, // watch for variable to change
function() {
if ($rootScope.currentUser) { // if the current user is defined, change path
$location.path('/users/' + $rootScope.currentUser.username);
}
}
)
最佳答案
尝试为您的用户解析路由。以下面的 plunker demo 为例。
Plunker Demo
该应用只是个人资料页面的简单登录页面。它有一个 HomeCtrl
,可在登录后导航到 ResolveCtrl
(这是个人资料页面)。
HomeCtrl
只是管理一个登录 View 。当用户成功登录后,我们导航到个人资料页面。 (Auth 对象是我在 Plunker 中提供的自定义包装器)。
.controller('HomeCtrl', function($scope, Auth, $window) {
$scope.user = {
email: 'bob@email.com',
password: 'password'
};
$scope.login = function() {
Auth.login('password', $scope.user);
};
Auth.onLogin(function(e, user) {
console.log('logged in!');
$window.location.href = '#/resolve';
});
})
现在我们已经登录了,我们将使用 ResolveCtrl
。该 Controller 在加载之前解析当前用户。那是 data
参数。
.controller('ResolveCtrl', function($scope, $route, data) {
$scope.user = data;
})
但是那个参数是从哪里来的呢?我们可以在 $routeProvider 中设置一个解析对象。这告诉 ResolveCtrl
在我们解决这个 promise 之前它不能加载。由于 Auth.getCurrentUser() 返回一个 promise ,我们只需要返回它,它就会为我们解决。
.config(['$routeProvider',
function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: '_home.html',
controller: 'HomeCtrl',
})
.when('/resolve', {
templateUrl: '_resolve.html',
controller: 'ResolveCtrl',
resolve: {
data: function(Auth) {
// load the user before the view is loaded
return Auth.getCurrentUser();
}
}
})
.otherwise({
redirectTo: '/'
});
}
])
现在,当页面加载时,我们知道用户会在那里。
关于javascript - AngularFire - 等到在 Controller 中检索到用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24766428/