8

我正在尝试使用 Angularjs 从 USGS 地震源中收集数据。通常,您需要将 ?callback=JSON_CALLBACK 添加到 URL 的末尾,以便 Angular 使用它,但是 USGS 提要不识别此选项。

我使用的 URL 是http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojsonp并添加 ?callback=JSON_CALLBACK (例如http://earthquake.usgs.gov/earthquakes /feed/v1.0/summary/all_day.geojsonp?callback=JSON_CALLBACK ) 返回包装在名为 eqfeed_callback 的函数中的数据集。

有没有办法使用这些数据?我有一个 eqfeed_callback 函数,但它不在范围内,这使得使用 Angular 毫无意义。

这是我所拥有的代码:

function QuakeCtrl($scope, $http) {

    $scope.get_quakes = function() {
        var url = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojsonp';
        $http.jsonp(url)
    }

}

function eqfeed_callback(data) {
    return data;
}

有什么方法可以将数据返回到范围内,或者有角度地在内部使用 eqfeed_callback 函数?

4

3 回答 3

18

另一种选择是在范围内定义 eqfeed_callback,如下所示:

function QuakeCtrl($scope, $http) {
    $scope.data = null;
    $scope.get_quakes = function() {
      var url = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojsonp';
      $http.jsonp(url)
    }

    window.eqfeed_callback = function(data) {
      $scope.data = data
    }
}
于 2013-10-15T07:12:14.427 回答
0

想到的唯一想法是(blech)使用全局,然后手动触发 Angular 更新,例如:

var callback$scope;
function QuakeCtrl($scope, $http) {

    $scope.get_quakes = function() {
        var url = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojsonp';
        callback$scope = $scope;
        $http.jsonp(url)
    }

}

function eqfeed_callback(data) {
    if (callback$scope) {
        // 1. Use callback$scope here
        // 2. Set callback$scope to undefined or null
        // 3. Trigger an Angular update (since it won't be automatic)
    }
}

不漂亮,但是...

于 2013-10-15T07:05:53.850 回答
0

扩展@MichaelVanRijn的回答:

为了保持“全球和平”,在需要的时候定义全局函数,然后立即取消它。

.controller('QuakeCtrl', function($window, $scope, $http) {
  $scope.get_quakes = function() {
    $window.eqfeed_callback = function(data){
      console.log("quake data", data)
    };

    // load your jsonp data
    $http.jsonp('http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojsonp')
    .then(function(success) {
      console.log(success);
      $window.eqfeed_callback = null;
    }, function(fail) {
      console.log(fail);
      $window.eqfeed_callback = null;
    })
  }
})
于 2017-01-21T18:57:18.013 回答