$http 工厂只在第一个控制器上工作

$http factory only working on first controller

我有一个正在获取数据并将其返回给控制器的工厂。它在第一个控制器上有效,但 returns 在第二个控制器上无效。我的印象是我可以将其传递给所有控制器。一分钟,我在想也许它只能被实例化一次,所以我用同样的步骤创建了另一个工厂。还是一样的结果。它在第二个控制器中返回了一个空数组

//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

您必须 return 您的承诺,否则您的对象会在承诺执行前被 return 编辑。

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