2014-12-09 5 views
1

컨트롤러가로드되기 전에 서버 측에서 값을 가져 오려고합니다. 나는 이것을 달성하기 위해 해결자를 사용하고 있습니다.컨트롤러를로드하기 전에 해결되지 않았습니다.

'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를 인쇄하려고하면 가져온 값은 내가 다음과 같은 방법에 routeConfig 확장 모든 컨트롤러에 표시 할 필요가 있기 때문이다.

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

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

}; 

는 여기에 다음과 같은 오류가 점점 오전 : 형식 오류 : 정의되지 않은 재산 'ID를'읽을 수 없습니다.

왜 컨트롤러를로드하기 전에 값이 확인되지 않습니까?

+0

$ scope.activeEnvironment가 할당되지 않았습니다 ... – pixelbits

+0

죄송합니다. 코드를 편집했습니다. 내가 코드를 공유 할 수 없기 때문에 코드를 다시 작성해야했습니다. – Sanja

답변

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 
} 

또한 $의 rootScope를 사용하여 다음 컨트롤러에 user를 해결 주입하는 것이 좋습니다 : 마지막으로 단지에 대한

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

더 나은 코딩 스타일,이 과제

$rootScope.activeUser = users[0] 

약간 혼란 스럽습니다. 더 읽기 쉽습니다.

$rootScope.activeUser = users[0]; 
deffered.resolve(users[0]); 
관련 문제