我似乎在将json从我的工厂发送到控制器
时出现问题这是我的工厂
.factory("UserService", function($http) {
var LevelsHere;
$http.get("/assets/images/generated.json").success(function(data){
LevelsHere = data;
return LevelsHere;
});
return {
all: function() {
return LevelsHere;
},
first: function() {
return LevelsHere[0];
}
};
})
我只是想用这个工厂发送json对象(或者它的位)。我可以在http get里面调试console.log似乎抓住了json就好了。我似乎已经撞墙了,任何帮助都会非常感激。我希望所有广告的第一个功能都能正常运行。谢谢!
我首先通过使用json字符串对其上面的levelsHere进行硬编码来获得成功,例如var levelsHere = [{" stuff in here"}],但是当我将它移到$ http时它没有&# 39;工作。
答案 0 :(得分:5)
由于您没有任何$watch
来查看异步$http.get
请求返回的值,因此更新后的值不可供消费者使用。当$http.get
请求返回一个承诺时,您可以利用承诺并在then()
中更新承诺成功的值,如下所示:
var app = angular.module('app', [])
.factory("UserService", function($http) {
var LevelsHere = $http.get("https://api.github.com/users/mralexgray/repos")
.success(function(data){
return data;
});
return {
all: function() {
return LevelsHere;
}
};
})
.controller('controller', function(UserService, $scope){
UserService.all().then(function(data){
$scope.value = data;
});
})
<强> DEMO 强>
答案 1 :(得分:0)
什么不能正常工作?我的猜测是你在这个工厂方法后立即得到了undefined,因为$ http使用了延迟对象
答案 2 :(得分:0)
您在异步调用完成之前返回LevelsHere。您的操作顺序如下:
更好的方法是返回承诺:
return $http.get("/assets/images/generated.json")
然后在您的控制器中,您可以通过调用success函数从promise获取值。如果您尝试在工厂中解析承诺并返回值,则控制器将尝试在从服务器返回之前使用该值。
var promise = UserService()
promise.success(function(data){
// do something with data
}