2013-06-06 25 views
5

Tôi có một cuộc gọi ajax bên trong .run() tải một biến vào $ rootScope Biến đó là cần thiết trong bộ điều khiển kết hợp với một khung nhìn.Angular .controller() chạy trước .run()

Lỗi Loại::

Đôi khi trên refresh (F5) bởi thời điểm .controller đang tải không có gì bên trong $ rootScope.user.fedUnit kết quả là không thể đọc thuộc tính 'fedUnit' không xác định

Bất kỳ cách để trì hoãn việc tải bộ điều khiển cho đến sau khi .run() kết thúc? Dường như không thể tìm thấy nó.

app.run(function($rootScope, $http, $location, SessionFactory, TokenHandler) { 
    token = TokenHandler.getToken(); 
    if (token != null) { 
     SessionFactory.get({ token : token }, 
      function success(response, responseHeaders) { 
       $rootScope.user = response; 
      } 
     ); 
    } 
}); 

app.controller('UnitController', function($scope, $rootScope, $location, UnitFactory) { 
    $scope.updateUnits = function() { 
     UnitFactory.query({fedUnit: $rootScope.user.fedUnit}, function success(response, responseHeaders) { ... 

Giải pháp

$rootScope.foo = $q.defer(); 
$rootScope.foo.resolve(); when AJAX is done; 
$rootScope.foo.promise.then(..) in the controller. 

nhờ @misterhiller (twitter)

+3

Tôi cảm thấy rằng 'run()' của bạn đã thực sự kết thúc trước khi bộ điều khiển tải - nó chỉ chạy() dường như chứa một cuộc gọi không đồng bộ - Nó được gọi và quên cho đến khi nó trả về, trong khi trình duyệt tiến hành thực hiện của bộ mã tiếp theo - trong quá trình gọi bộ điều khiển của bạn - vì yêu cầu GET vẫn không được trả về (trong phân chia thứ hai) và do đó dẫn đến lỗi - Bạn có thể đăng mã cho dịch vụ 'SessionFactory' không? – callmekatootie

+0

Bạn cần phải thực hiện công việc này một cách không đồng bộ. Tạo một nhà cung cấp tải thực hiện yêu cầu AJAX. – TheHippo

+0

Có, Sessionfactory là một cuộc gọi tài nguyên $ đơn giản cho một số loại API còn lại. – fritz

Trả lời

7

Giải pháp ở khối mã chức năng:

app.run(function($rootScope, $http, $q, SessionFactory, TokenHandler) { 

    $rootScope.ajaxCall = $q.defer(); 

    token = TokenHandler.getToken(); 
    if (token != null) { 
     SessionFactory.get({ token : token }, 
      function success(response, responseHeaders) { 
       $rootScope.user = response; 

       $rootScope.ajaxCall.resolve(); 
      } 
     ); 
    } 
}); 

app.controller('UnitController', function($scope, UnitFactory) { 

    $scope.ajaxCall.promise.then(function() { 
     $scope.updateUnits = function() { 
      UnitFactory.query({fedUnit: $scope.user.fedUnit}); 
     } 
    }); 
}); 

tôi không sử dụng $ rootScope trong bộ điều khiển.

Các vấn đề liên quan