2016-05-27 1 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

:コントローラで

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

:これを試してみてください?これは非同期的な問題のようです。 –

+0

get関数の実行中にchartDataに期待されるデータが含まれているかどうかを確認します。 –

答えて

0

get関数にchartDataを渡す必要があります。あなたはsimultaniously両方のコントローラをロード

.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

あなたはget呼び出しの前allをロードする必要があります。この

.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); 
     }) 
    }) 

を試してみてください。あなたの最初のコントローラでは、allコールが発生しています。しかし、2番目のコントローラーが最初のコントローラーで同時に初期化される可能性があるため、2番目のコントローラーが使用可能になるわけではありません。それまではallコールが終了していない可能性があります。

関連する問題