1
我有两个服务 - 一个存储用户的细节和对方打个电话来获取这些细节:控制顺序
userService存储用户的细节在整个应用程序中使用(
:即控制器,服务等)function userService($log) {
var id = '';
var username = '';
var isAuthenticated = false;
var service = {
id: id,
username: username,
isAuthenticated: isAuthenticated
};
return service;
}
authService使用(希望只是一次)来检索从Web API控制器用户细节注入210
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发送一次,无论哪条路由被提供,并且之后可用于任何路由,控制器等。
是否有更好的(最佳实践)方式来执行此操作?