我正在编写我的第一个AngularJS应用程序。该应用程序需要在不同的控制器中了解当前用户。当前用户是通过rest调用检索的。首先,我只是使用$scope在页面顶部添加了当前用户信息:
var currentUser = {};
app.controller('currentUserCtrl', function($scope, $http) {
$scope.currentUser = null;
$http.get(rootUrl + '/timetracker/user/current').success(
function(response) {
$scope.currentUser = response;
currentUser = response;
});
}
);
这个控制器本身是正常工作的,但是其他控制器无法访问“currentUser”。我第二次尝试(在阅读有关全局变量的文章之后)是使用$rootScope。所以我改变了上面的$rootScope.currentUser = response;
并省略了var currentUser
。我在所有控制器中都添加了$rootScope
,并尝试获取currentUser.id
。但是这也没有起作用 - 用户对象为空。我的第三次尝试是使用一个工厂:
app.factory('currentUser', function($http){
var currentUser = {};
$http.get(rootUrl + '/timetracker/user/current').success(
function(response) {
currentUser = response;
});
return currentUser;
});
我的控制器现在注入了“currentUser”,但是它也是null(我想获取的所有值都是“未定义”的)。那么如何使当前用户全局可用?
可能是在异步调用和变量写入成功之前使用了currentUser?如何确保currentUser调用已经完成?
编辑 使用currentUser的控制器:
app.controller('createBookingCtrl', function($scope, $http, $filter, currentUser) {
//list of projects for current user (usersprojects)
$scope.projectsList = {};
$http.get(rootUrl + '/timetracker/usersprojects/user/' + currentUser.id).success(function(response) {
for (var i = 0; i < response.length; ++i)
//map users project by projects name
$scope.projectsList[response[i].project.name] = response[i];
});
});
currentUser.id
的值未定义。
第二次编辑
我刚刚用js调试器测试了一下:在工厂函数中,currentUser = response
在其他控制器访问该值之后运行。那么如何确保/等待响应呢?