AngularJS 工厂 http 返回空
Posted
技术标签:
【中文标题】AngularJS 工厂 http 返回空【英文标题】:AngularJS factory http returns empty 【发布时间】:2013-04-26 13:30:42 【问题描述】:我是第一次尝试 AngularJS。我正在使用工厂从 http-get 请求中获取 JSON 数据,但在 ajax-request 完成之前,该对象返回为空。
工厂:
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 响应之前返回照片数组一样。
【问题讨论】:
【参考方案1】:您应该修改您的代码以返回一个承诺并使用控制器中的值请参阅修改后的虚拟代码
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;
);
;
【讨论】:
我可以用这个作为post方法吗?【参考方案2】:使用 q promise 库意味着您的成功函数可以继续为您服务:
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);
);
;
]);
【讨论】:
谢谢。我认为这是最好的方法。它使控制器保持精简。 谢谢,这就是我想要的。 :) 我们如何处理错误?出现错误时项目的价值是多少?【参考方案3】:与$http
相比,使用$resource
可以实现您想要的,并且给您更多的控制权
(不要忘记将ngResrouce
作为应用程序的依赖项。)
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();
;
【讨论】:
与@Ajay beniwal 回答相比,这样做有什么优势? 当使用$resource
时,你的每张照片都是AngularJs resource
对象,其中包含$save
$delete
等方法,这使得使用Restful api更容易。以上是关于AngularJS 工厂 http 返回空的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 AngularJS 代码中的 HTTP POST 返回空? [复制]
Angularjs 基于karma和jasmine的单元测试