消失/重新出现的JSON数据

时间:2015-12-16 18:00:32

标签: javascript angularjs json

我正在使用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属性。如您所见,在完整响应中,它是空的,但直接访问时它包含数据。

console

问题

我们正在使用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;

});

1 个答案:

答案 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);