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

заряжаются оба контроллера Simultaniously? Это похоже на асинхронную проблему. –

+0

Проверьте, содержат ли данные диаграммы ожидаемые данные во время выполнения функции get. –

ответ

0

Вам необходимо передать chartData на вашу функцию получения. Попробуйте это:

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'. Вы не должны использовать службу '$ q' в запросе' $ http'. Потому что HTTP-запрос возвращает обещание сам по себе. См. Мой вопрос здесь: http://stackoverflow.com/questions/36631601/angularjs-simple-then-or-q-service-in-async-requests –

1

Try This

.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 перед тем get вызова. В вашем первом контроллере all звонок происходит. Но это не означает, что ваш второй контроллер будет доступен, потому что ваш второй контроллер может быть инициализирован в то же время с вашим первым контроллером, и до этого может быть ваш звонок all не будет завершен.

Смежные вопросы