我正在调用控制器来获取API值。如何在$ http方法之外传递数组?
我需要将数组pa[]
传递给$scope.myData = pa;
。
首先,console.log(pa)打印值[10,20,30,40]。
其次,console.log(pa)清空数组[]。
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回调函数之外获取数组?
答案 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);