我正在尝试访问我的角度控制器中的http标头但我未定义。此外,我能够看到我的角度服务中的标题响应,这在我的控制器中没有反映出来。有人可以告诉我我错过了什么吗?请参阅以下代码:
服务:
cmApp.service('supplierService', function ($http, $q) {
this.getSuppliers = function (orderByColumn, skipRows, takeRows) {
var deferred = $q.defer();
$http({
method: 'GET',
url: 'api/supplier',
params: { orderBy: orderByColumn, skip: skipRows, take: takeRows },
timeout: 30000,
cache: false
}).
success(function (data, status, headers, config) {
// any required additional processing here
deferred.resolve(data, status, headers, config);
}).
error(function (data, status) {
deferred.reject(data, status, headers, config);
});
return deferred.promise;
}
控制器:
supplierService.getSuppliers($scope.orderby, $scope.skip, $scope.take)
.then(function (data, status, headers, config) {
**//getting undefined here.**
$scope.totalRecords = parseInt(headers('X-TotalRowCount'));
$scope.suppliers = data;
}, function (error) {
// error handling here
});
答案 0 :(得分:18)
我自己找到了解决方案。我所要做的就是创建一个数组并将所有这些值添加到相同的&将其返回给控制器。请参阅以下更新的代码:
服务:
cmApp.service('supplierService', function ($http, $q) {
this.getSuppliers = function (orderByColumn, skipRows, takeRows) {
var deferred = $q.defer();
$http({
method: 'GET',
url: 'api/supplier',
params: { orderBy: orderByColumn, skip: skipRows, take: takeRows },
timeout: 30000,
cache: false
}).
success(function (data, status, headers, config) {
// any required additional processing here
var results = [];
results.data = data;
results.headers = headers();
results.status = status;
results.config = config;
deferred.resolve(results);
}).
error(function (data, status) {
deferred.reject(data, status, headers, config);
});
return deferred.promise;
}
控制器:
supplierService.getSuppliers($scope.orderby, $scope.skip, $scope.take)
.then(function (response) {
$scope.suppliers = response.data;
$scope.totalRecords = parseInt(response.headers["x-totalrowcount"]);
}, function (error) {
// error handling here
});
答案 1 :(得分:6)
这个问题很旧,但$ http()会返回一个promise本身。您可以从您的服务中返回,无需创建新的承诺。你甚至可以在使用.success()和.error()之后执行此操作,或者即使在使用.then()之后,它们也会继续链接。
答案 2 :(得分:2)
自定义标头将在同一个域中显示。但是,对于跨域情况,服务器必须发送Access-Control-Expose-Headers:X-Foo,并将跨域属性作为* ...标头,以使自定义标头可见。
答案 3 :(得分:1)
我必须从我的Rest服务的响应 标题访问令牌和 TokenExpiry 时间,然后存储它在我的 $ rootScope 中。 这是我使用的代码:
$scope.Authenticate=function(){
var EncDecUserPass=decodeURIComponent(encodeURIComponent($scope.LoggedUserName+':'+$scope.LoggedUserPassword)) ;
$http(
{method: 'GET',
url: 'http://localhost:53256/api/Products/Authenticate',
cache: false,
headers:{'Authorization':'Basic '+window.btoa(EncDecUserPass)}
}
).success(function(data, status, headers, config) {
//Here it goes
$rootScope.token=headers().token;
$rootScope.tokenExpirySec=headers().tokenexpiry;
}).error(function(data, status, headers, config) {
alert('Invalid User');
});
}