2014-09-03 29 views
0

我有一個服務調用API並獲取json響應。我將這個服務注入到我的控制器中,並嘗試用這個接收到的數據設置$ scope.tank變量。當我嘗試稍後使用這個變量時(在同一個控制器中!)它是未定義的。但有趣的是,數據顯示在前端。

我看遍了所有的stackoverflow,我無法弄清楚這一點。我創建了一個plunker例子 - http://plnkr.co/edit/DkFNE8E9897dSF19eaU9?p=preview

我的服務:

appServices.service('TankService', function($q, $http) { 

    var data, deferred = $q.defer(); 

    return { 

     init: function(id) { 

      var defer = $q.defer(); 

      $http.get(options.api.base_url, { cache: 'true'}) 
      .success(function(response) { 
       data = response; 
       deferred.resolve(data); 
      }); 

     }, 

     // return promise 
     getData: function() { 
      return deferred.promise; 
     } 

    }; 

}); 

我打電話給我的數據,控制器是這樣的:

appControllers.controller('TankViewCtrl', ['$rootScope', '$scope', '$q', '$routeParams', '$location', '$sce', '$route', 'TankService', 
    function TankViewCtrl($rootScope, $scope, $q, $routeParams, $location, $sce, $route, TankService) { 

     var id   = $routeParams.tank_id; 
     $scope.id  = id; 
     $scope.tank  = []; 

     // call our data 
     TankService.init(id); 

     TankService.getData().then(function(data){ 
      $scope.tank = data; 
     }); 

     // why is this undefined? 
     console.log($scope.tank); 

    } 
]); 

預先感謝您的幫助!

回答

3

HTTP調用是異步請求。

您要求您的控制器顯示請求的結果,而不是事先確定您有答案。這就是爲什麼你得到undefined

用途:

TankService.getData().then(function(data){ 
    $scope.tank = data; 
    console.log($scope.tank); 
}); 
+0

謝謝您的回答。那麼在這個控制器內部沒有辦法進一步處理數據?我需要這個分頁。 – 2014-09-03 15:42:46

+1

是的,你可以。只要確保你的承諾解決後,就用'then'調用的函數來做。 – Goodzilla 2014-09-03 15:47:39

+0

我很蠢。謝謝。我現在看到,我幾乎按照我應該做的那樣做,但是失敗了最基本的東西:D – 2014-09-03 16:01:48

相關問題