我有两个服务 - 一个存储用户的细节和对方打个电话来获取这些细节:
整个应用程序所使用userService存储用户的信息(在控制器,服务等即注入)
function userService($log) {
var id = '';
var username = '';
var isAuthenticated = false;
var service = {
id: id,
username: username,
isAuthenticated: isAuthenticated
};
return service;
}
authService使用(希望只是一次)来检索从Web API控制器用户详细信息:
function authService($log, $http, userService) {
$log.info(serviceId + ': Inside authService method');
var service = {
getUserDetails: getUserDetails
};
return service;
function getUserDetails() {
$log.info(serviceId + ': Inside getUserDetails method');
return $http.get('api/authentication', { cache: true });
}
}
最初,我曾在像这样一个.RUN块调用authService火:
.run(['$log', 'authService', 'userService', function ($log, authService, userService) {
authService.getUserDetails()
.then(querySucceeded);
function querySucceeded(result) {
userService.id = result.data.Id;
userService.username = result.data.username;
}
}]);
但问题是,getUserDetails,返回的承诺并没有解决,直到将我开除控制器后,因此,太晚了我。 用户数据还没有准备好。
然后我看着在$ stateProvider(对于UI的路由器)的决心选项:
.state('dashboard', {
url: '/dashboard',
views: {
header: {
templateUrl: 'app/partials/dashboard/header.template.html',
controller: 'DashboardHeaderController',
controllerAs: 'dashboardHeaderVM',
resolve: {
user: function (authService) {
return authService.getUserDetails();
}
}
}
}
})
假设是认为不会被渲染,直到解决部分的承诺是,好了,解决了。 这似乎很好地工作。
这里的控制器,我使用返回的用户属性(的相关部分):
function DashboardHeaderController($log, user) {
var vm = this;
// Bindable members
vm.firstName = user.data.firstName;
}
不过,我有两条路线(更多的惊喜),并且用户可以浏览到任何一个。 我需要有对authService每个州部分下决心财产? 我想火调用authService.getUserDetails只有一次,无论哪个路线服务,可将其之后的任何路线,控制器等。
有没有更好的(最佳实践)的方式来做到这一点?