$http factory работает только на первом контроллере

У меня есть фабрика, которая получает данные и возвращает их контроллеру. Он работает на первом контроллере, но ничего не возвращает на втором. У меня сложилось впечатление, что я могу передать это всем контролерам. На минуту я подумал, что, возможно, его можно создать только один раз, поэтому я создал еще одну фабрику с теми же шагами. Все тот же результат. Он вернул пустой массив во втором контроллере

//Factory

angular.module('myApp')
    .factory('classData', function($http){

      return {

        getClassData : function() {

          var studentData = [ ];

          $http({
            method: 'GET',
            url: 'theUrl'
          }).success(function(data){

            for(var i = 0; i < data.length; i++)
              studentData.push(data[i]);

          }).error(function(){
            alert("error", error);
          });

          return studentData;

        }
      };
    });


//Controller 1:

angular.module('myApp')
  .controller('studentListCtrl', function($scope, classData, statService) { //this controller is just view logic

    $scope.sortType     = 'attendanceYtd';
    $scope.searchStudent   = '';
    $scope.students = classData.getClassData(); //returns all 		data
	
//Controller 2: 

angular.module('attendanceApp')
  .controller('studentHistoryCtrl', function($scope, $stateParams, classData) {
    //get all  data
    $scope.students = classData.getClassData();
    console.log($scope.students); //returning an empty array


person Community    schedule 23.05.2016    source источник
comment
Я удивлен, что это вообще сработало, как и не должно. Вы явно не понимаете, что такое асинхронный код. обратные вызовы успеха и ошибки могут быть вызваны событием через несколько минут, и вы сразу же возвращаете результат. Это не должно работать.   -  person sielakos    schedule 23.05.2016


Ответы (1)


Вы должны вернуть свое обещание, иначе ваш объект будет возвращен до выполнения обещания.

angular.module('myApp')
    .factory('classData', function($http){

      return {

        getClassData : function() {

          var studentData = [ ];

          return $http({
            method: 'GET',
            url: 'theUrl'
          }).then(function(data){
            for(var i = 0; i < data.length; i++)
              studentData.push(data[i]);
            return studentData;
          }, function(){
            alert("error", error);
          });


        }
      };
    });

а затем в своем контроллере используйте свое обещание:

classData.getClassData().then(function(results){
    $scope.students = result;
});
person Deblaton Jean-Philippe    schedule 23.05.2016
comment
Спасибо! Просто изменил мой подход, и он сработал. Большое спасибо. - person ; 23.05.2016