2014-12-09 42 views
1

我想从任何控制器加载之前从服务器端获取值。我正在使用解析器来实现此目的。由于获取的值必须是可见的所有控制器我伸出routeConfig以下方式:解决未解决加载控制器之前

'use strict'; 

angular.module('myApp', [.....]). 

config(['$routeProvider', function ($routeProvider) { 

    var universalResolves = { 

     user: function(User, $q, $rootScope) { 
      var deffered = $q.defer(); 

      User.query({}, 
       function (users) { 
        deffered.resolve(
         $rootScope.activeUser = users[0] 
        ) 
       }, function(){ 
        deffered.reject(); 
       } 
      ); 

      return deffered.$promise; 
     } 


    }; 

    var customRouteProvider = angular.extend({}, $routeProvider, { 
     when: function(path, route) { 
      route.resolve = (route.resolve) ? route.resolve : {}; 
      angular.extend(route.resolve, universalResolves); 
      $routeProvider.when(path, route); 
      return this; 
     } 
    }); 

    customRouteProvider.when('/users', { 
     templateUrl: 'partials/users.html', 
     controller: 'UserController' 
    }); 

    customRouteProvider.otherwise({redirectTo: '/home'}); 
}]); 

但是,当我尝试从我收到“未定义”控制打印activeUser。

.controller('UserController', ['$scope', function ($scope) { 

     console.log($scope.activeUser.id); 
     ..... 

}; 

在这里,我收到以下错误: 类型错误:无法读取的未定义的属性“身份证”。

为什么在加载控制器之前未解决该值?

+0

$ scope.activeEnvironment永远不会被分配... – pixelbits 2014-12-09 11:55:25

+0

对不起,我编辑了代码。我需要重写代码,因为我不允许分享它。 – Sanja 2014-12-09 11:58:45

回答

0

有延迟对象没有这样的属性$promise,它是promise

user: function(User, $q, $rootScope) { 
    var deffered = $q.defer(); 

    User.query({}, function(users) { 
     deffered.resolve($rootScope.activeUser = users[0]); 
    }, function() { 
     deffered.reject(); 
    }); 

    return deffered.promise; 
    //   ^don't put $ here 
} 

而且最好是注入解决user到控制器,然后使用$ rootScope:

.controller('UserController', ['$scope', 'user', function ($scope, activeUser) { 
    console.log(activeUser.id); 
}; 

的最后只是更好的编码风格,此作业

$rootScope.activeUser = users[0] 

有点混乱。它更具可读性:

$rootScope.activeUser = users[0]; 
deffered.resolve(users[0]);