2016-05-27 120 views
2

我正在研究應用程序以讀取JSON文件。

目前我能夠檢索和閱讀JSON文件,但問題是何時在JSON中選擇數據。

錯誤「無法讀取未定義的屬性‘長’」

下面是我的代碼。

Services.js

.factory("mainData", function($http, $log, $q) { 
    var chartData; 

    return { 

     all: function() { 
      var d = $q.defer(); 
      $http({ method: 'GET', 
       url: 'http://localhost:8080/aZolla/getGlazCharts.do'}) 
        .success(function (data, status, header, config) { 
         d.resolve(data); 
         }) 
        .error(function (data, status, header, config) { 
         $log.warn(data, status, header, config); 
      }); 

      chartData = d.promise; 

      return d.promise;  
     }, 

     get: function(chartID) { 
     for (var i = 0; i < chartData.length; i++) { 
     if (chartData[i].id === parseInt(chartID)) { 
      return chartData[i]; 
     } 
     } 
     return null; 
    } 
}; 
}); 

Controller.js

.controller("ChartsListsCtrl", function($scope, mainData) { 

    mainData.all().then(function(data){ 
    $scope.chartLists = data; 
    }    
    ) 

.controller('ChartsCtrl', function($scope, $stateParams, mainData) { 

    $scope.chart = mainData.get($stateParams.chartId); 

}) 
+0

您加載兩個控制器同時放?這看起來像一個asyncronic問題。 –

+0

檢查getData函數執行期間chartData是否包含預期數據。 –

回答

0

你應該通過chartData到你的get函數。試試這個:

get: function(chartID, chartData) { 
    for (var i = 0; i < chartData.length; i++) { 
    if (chartData[i].id === parseInt(chartID)) { 
     return chartData[i]; 
    } 
} 

在控制器:

.controller('ChartsCtrl', function($scope, $stateParams, mainData) { 
    mainData.all().then(function(data){ 
    $scope.chart = mainData.get($stateParams.chartId, data); 
    }); 
}) 
+0

謝謝!它的工作! – fahmishah

+0

很高興爲您效勞。並且要小心使用'$ q'服務。 '$ http'請求中不應該使用'$ q'服務。因爲http請求本身返回承諾。在這裏看到我的問題:http://stackoverflow.com/questions/36631601/angularjs-simple-then-or-q-service-in-async-requests –

1

嘗試這個

.controller("ChartsListsCtrl", function($scope, mainData) { 

    mainData.all().then(function(data){ 
    $scope.chartLists = data; 
    }    
    ) 

    .controller('ChartsCtrl', function($scope, $stateParams, mainData) { 
     mainData.all().then(function(data){ 
     $scope.chart = mainData.get($stateParams.chartId); 
     }) 
    }) 

您需要get調用來加載all。在您的第一個控制器all正在進行呼叫。但這並不意味着在你的第二個控制器中它將可用,因爲你的第二個控制器可能與你的第一個控制器同時被初始化,直到那時可能是你的all調用沒有完成。

相關問題