我需要从api调用中为ng-csv分配数据。 我试过这个。但没有工作
script:
$scope.getArray = function () {
var temp;
$http.get(Config.serviceUrlBase + '/abc/ExportToCSV').success(function(data, status, headers, config) {
temp = data;
})
return temp;
};
//here data is string separated by comma and new line for csv format.
aspx file:
<Button ID="ExportToCSV" ng-csv="getArray" filename="test.csv" lazy-load="true"
>ExportToCSV</Button>
我错过了什么吗?
答案 0 :(得分:8)
temp
变量被异步分配,这意味着return temp;
实际返回undefined
。
ng-csv
属性接受承诺,因此您应使用$q
:
$scope.getArray = function () {
var deferred = $q.defer();
$http
.get(Config.serviceUrlBase + '/abc/ExportToCSV')
.success(function(data, status, headers, config) {
deferred.resolve(data);
});
return deferred.promise;
};
注意:$q
是一种服务,您可以在控制器中注入,也可以注入任何东西。
答案 1 :(得分:5)
你错过'()'。
ng-csv =“ getArray()”
答案 2 :(得分:5)
我遇到同样的问题,并通过以下方式解决:
$scope.getArray = function () {
var temp = $http.get(Config.serviceUrlBase + '/abc/ExportToCSV').success(function(data, status, headers, config) {
return data;
})
return temp;
};
问题是因为临时变量默认为undefined
。所以,你应该等到变量从promise返回值。
答案 3 :(得分:2)
要解决此问题,您需要在延迟加载时使用promise,但是由于数据是JSON格式,因此还必须将已解析的响应包含在数组中。
当我们返回一个集合时,以JSON格式保留响应导致0仅在第一列下加载。
在下面的AngularJS示例中,我们有一个我们想要存储在数组中的集合(即数据行):
$scope.getArray = function() {
var deferme = $q.defer();
$http.get(url).success(function(data) {
var myArr = [];
for(var i=0; i < data.length; i++) {
myArr.push([data[i].value1, data[i].value2, etc...]);
}
deferme.resolve(myArr);
});
return deferme.promise;
}
答案 4 :(得分:0)
ng-csv
指令的值应该是表达式,值或promise。
因此您可以指定$scope.getArray
myapp.controller('myctrl', function ($scope) {
$http.get(url)
.success(function (data) {
$scope.getArray = data;
});
});
AngularJS正在关注范围变量的更新。