2013-05-02 31 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