2013-05-02 30 views
23

我在第一次尝试AngularJS。我使用工厂从http-get请求获取JSON数据,但是在ajax请求完成之前,对象返回为空。AngularJS factory http returns empty

厂:

myDemo.factory('photosFactory', function($http) { 
    var photos = []; 

    var factory = {}; 

    factory.getPhotos = function() { 
     $http({ 
      url: 'content/test_data.json', 
      method: 'GET' 
     }).success(function(data, status, headers, config) { 
      photos = data; 
      return photos; 
     }); 
    }; 
    return factory; 
}); 

控制器:

controllers.AppCtrl = function($scope, $location, $http, photosFactory) { 
    $scope.photos = []; 
    init(); 
    function init() { 
     $scope.photos = photosFactory.getPhotos(); 
    } 
}; 

这是我想出。当控制器设置$ scope.photos时,该值为空,就像它在用ajax响应填充之前返回照片数组一样。

回答

55

您应该修改代码以返回一个承诺,使用控制器请数值看空修改后的代码

myDemo.factory('photosFactory', function($http) { 
return{ 
    getPhotos : function() { 
     return $http({ 
      url: 'content/test_data.json', 
      method: 'GET' 
     }) 
    } 
} 
}); 

和控制器 -

controllers.AppCtrl = function($scope, $location, $http, photosFactory) { 
    $scope.photos = []; 
    photosFactory.getPhotos().success(function(data){ 
     $scope.photos=data; 
    }); 
}; 
+0

我可以用这个方法后? – 2016-06-30 16:18:33

7

使用$resource将让你实现你想要,加上给你更多的控制相比$http

(不要忘记包括。作为一个依赖于你的应用程序)使用Q承诺库

myDemo.factory('photosFactory', function($resource) { 
    var factory = {}; 

    factory.getPhotos = $resource('content/test_data.json', {}, { 
     'query': {method: 'GET', isArray: true} 
    }); 
    return factory; 
}); 

controllers.AppCtrl = function($scope, $location, $http, photosFactory) { 
    $scope.photos = []; 
    init(); 
    function init() { 
     $scope.photos = photosFactory.getPhotos.query(); 
    } 
}; 
+0

与@Ajay beniwal答案相比,这样做的优势是什么? – user1121487 2013-05-02 12:24:05

+4

当使用'$ resource'时,你的每张照片都是包含诸如'$ save'' $ delete'之类的方法的AngularJs'资源'对象,这使得使用Restful API变得更容易。 – 2013-05-02 12:30:33

26

意味着你的成功的功能可以留在你的服务:

app.factory('Data', function ($http, $q) { 
    return { 
     ajaxItems: function() { 
      var deferred = $q.defer(); 
      $http({ method: "POST", url: "/Home/GetSearchResults" }) 
       .success(function (data, status, headers, config) { 
        deferred.resolve(data); 
       }).error(function (data, status, headers, config) { 
        deferred.reject(status); 
       }); 
      return deferred.promise; 
     } 
    } 
}); 

app.controller('ResultsCtrl', ['$scope', 'Data', function ($scope, Data) { 
    $scope.get = function() { 
     $scope.items = Data.ajaxItems(); 
     //the model returns a promise and THEN items 
     $scope.items.then(function (items) { 
      $scope.items = items; 
     }, function (status) { 
      console.log(status); 
     }); 
    }; 
}]); 
+1

非常感谢。我认为这是做这件事的最好方式。它保持控制器精益。 – 2015-06-09 23:03:48

+0

谢谢,这就是我一直在寻找的。 :) – Mehmood 2015-11-27 15:18:25

+0

我们该如何处理错误?出现错误时项目的价值是多少? – 2015-12-07 10:49:27