2014-10-20 109 views
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发送一次,无论哪条路由被提供,并且之后可用于任何路由,控制器等。

是否有更好的(最佳实践)方式来执行此操作?

回答