用户使用用户名,电子邮件和密码进行注册。我使用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函数完成。有没有办法让我的控制器中有一个功能等到另一个功能完成?
我有一个解决方法,,但我很确定这不是正确的方法。现在,我正在观察要更新的用户变量,然后在更改为用户后调用所有函数,如:
$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);
}
}
)
答案 0 :(得分:4)
尝试为用户解析路线。以下面的plunker演示为例。
该应用只是个人资料页面的简单登录页面。它有一个HomeCtrl
,可以在登录后导航到ResolveCtrl
(这是个人资料页面)。
HomeCtrl
只管理登录视图。用户成功登录后,我们将导航到配置文件页面。 (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
。该控制器在加载之前解析当前用户。这是data
参数。
.controller('ResolveCtrl', function($scope, $route, data) {
$scope.user = data;
})
但那个参数来自哪里?我们可以在$ routeProvider中设置一个resolve对象。这告诉ResolveCtrl
在我们解决了这个承诺之前它无法加载。由于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: '/'
});
}
])
现在,当页面加载时,我们知道用户将在那里。