我正在使用Angular,并且有一个JSON响应,其中一个属性值正在消失(为空),但是如果你直接看它,它会出现(并且具有正确的值)。应该拥有数据的属性是vehicles
属性。
JSON数据
{
"data": {
"blocks": [
{
"vehicles": [
{
"agency": "ZGM Bike Share",
"mode": "bikeshare",
"name": "Research Chemistry Lab",
"space_count": 4
},
{
"agency": "ZGM Bike Share",
"mode": "bikeshare",
"name": "ENG North",
"space_count": 4
},
{
"agency": "ZGM Bike Share",
"mode": "bikeshare",
"name": "Research South",
"space_count": 6
}
]
}
],
"screen": {}
}
}
控制台
下面是2 console.log()
。一个是完整响应,另一个是直接访问vehicles
属性。如您所见,在完整响应中,它是空的,但直接访问时它包含数据。
问题
我们正在使用Angular,并且经过一些JS操作(在上面的console.log()
之后发生),我们将此对象传递给模板。因为它是作为完整对象传递的,所以它会以vehicles
为空传递它。
代码段
这是进行调用并处理响应的部分。
tsApp.service('updateService', function($http, $q, jsonResponse, $timeout, $interval, $log, $location) {
// Cut out a bunch of code that happens after getUpdate()
function getUpdate() {
var request = $http({
method: 'get',
dataType: 'json',
url: '/data/' + id + '.json',
timeout: updateRequestTimeout
});
return (request.then(handleSuccess, handleError));
}
function handleSuccess(response) {
console.log(response.data);
console.log(response.data.data.blocks[0].vehicles);
return response.data;
}
return updateService;
});
答案 0 :(得分:0)
因此,我从您的问题中了解以下内容:
您从远程服务器请求了一个资源,但是当从控制器等调用它时,角度服务没有返回任何内容。
问题是,你自己发起了请求,并且你将handleSuccess函数的值返回给服务本身,而不是它的调用者。
这里是固定代码:
tsApp.service('updateService', function($http, $q, jsonResponse, $timeout, $interval, $log, $location) {
var serviceObj = { vehicles: [] };
// Cut out a bunch of code that happens after getUpdate()
function getUpdate() {
var request = $http({
method: 'get',
dataType: 'json',
url: '/data/' + id + '.json',
timeout: updateRequestTimeout
});
request.then(handleSuccess, handleError);
}
function handleSuccess(response) {
console.log(response.data);
console.log(response.data.data.blocks[0].vehicles);
serviceObj.vehicles = response.data.data.blocks[0].vehicles;
}
return serviceObj;
});
现在,当您需要车辆对象时,您将致电:
updateService.vehicles
请注意,在检索到响应之前它将为空。要确保在使用它之前获得它,您还可以在rootScope上添加广播事件。这样,想要使用它的控制器/指令将能够确定它是否已经发送:
// Broadcast the handleSuccess event
serviceObj.ready = true;
$rootScope.$boradcast("updateService.vehicles.success", true);
// Listen to this event from other controller / directive to make sure the request finished up
if(updateService.ready === true) {
successFunc()
}
$rootScope.$on("updateService.vehicles.success", successFunc);