来自AngularJS的$ success回调函数
我正在调用控制器来获取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回调函数之外获取数组?
此代码是异步的。 在$http
服务有机会从API调用中获取值之前, pa
被分配给$scope.myData
。
您需要使用$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
成功方法中解析了promise,AngularJS将通知您的$scope
并更新该值,它将反映在您的模板/ DOM上。
这真的没有多大意义。 它应该是这样的:
$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
设置$scope.myData
等于pa
。 那只是在惹麻烦。
如果您更喜欢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);