来自AngularJS的$ success回调函数

时间:2013-11-06 12:03:34

标签: javascript jquery arrays angularjs callback

我正在调用控制器来获取API值。如何在$ http方法之外传递数组?

我需要将数组pa[]传递给$scope.myData = pa;

首先,console.log(pa)打印值[10,20,30,40]。

其次,console.log(pa)清空数组[]。

的JavaScript

function Ctrl($scope, $http) {
    var url = "https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0";
    var pa = [];
    $http({
        method: 'JSONP',
        url: url
    }).success(function (data) {

        for (i = 0; i < data.feed.entry.length; i++) {
            var entry = data.feed.entry[i];
            pa.push(entry.gsx$productivity.$t);
            console.log(pa); //[10,20,30,40,50]
        }
    });

    console.log(pa) // [] empty array

    $scope.myData = pa;
}

如何在$ success回调函数之外获取数组?

3 个答案:

答案 0 :(得分:3)

此代码是异步的。在pa服务有机会从您的API调用中获取值之前,$scope.myData已分配给$http

您需要使用$q服务承诺库来控制代码流。像这样:

function Ctrl($scope, $http, $q) {
  var url = "https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0";
  var pa = [];
  var paPromise = $q.defer()

  $http({
    method: 'JSONP',
    url: url
  }).success(function(data) {

      for (i = 0; i < data.feed.entry.length; i++) {
        var entry = data.feed.entry[i];
        pa.push(entry.gsx$productivity.$t);
        console.log(pa); //[10,20,30,40,50]
      }
      paPromise.resolve(pa)
    });

  $scope.myData = paPromise.promise;
}

在这里,我们注入$q服务并使用它来实例化变量paPromise。接下来,我们将此承诺提供给$scope.myData。一旦承诺在$http成功方法中得到解决,AngularJS将通知您的$scope并更新该值,它将反映在您的模板/ DOM上。

答案 1 :(得分:0)

这真的没有多大意义。它应该是这样的:

$scope.myData = [];
$http({
    method: 'JSONP',
    url: url
}).success(function (data) {

    for (i = 0; i < data.feed.entry.length; i++) {
        var entry = data.feed.entry[i];
        $scope.myData.push(entry.gsx$productivity.$t);
        console.log(pa); //[10,20,30,40,50]
    }
});

由于pa设置在控制器功能内部,因此它不会为您提供任何声明,然后将$scope.myData设置为pa。那只是在寻找麻烦。

答案 2 :(得分:-3)

如果您更喜欢jQuery Ajax,请使用extend函数将成功数据返回到外部,

$(function(){
    $.extend({
        returnData: function(url) {
            var result = null;
            var pa = [];
            $.ajax({
                url: url,
                type: 'get',
                dataType: 'jsonp',
                async: false,
                success: function(data) {
                    for (i = 0; i < data.feed.entry.length; i++) {
                        var entry = data.feed.entry[i];
                        pa.push(entry.gsx$productivity.$t);
                    }
                    result = pa;
                }
            });
            return result;
        }
    });
});
finaldata = $.returnData('https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0');
console.log(finaldata);