我正在开发一个显示分页照片列表的AJAX Angular应用程序。其中大部分都运行良好,但我遇到了一个我以前从未见过的问题:一旦加载,服务器中的一些数据在$ http调用过程中消失。经过分析,我认为响应转换出现了问题(见下文)。
在这种情况下,控制器调用一个JSON对象,该对象包含一个id列表(按日期排序)和基础中的照片总数。每次用户更改页面时都会进行此调用。
第一次(即,在页面加载时),它工作正常,但一旦页面更改它就会出错。它确实从服务器加载数据,并返回所述对象:这个对象确实给了我总数 - 但提供了一个空数组而不是所需的id列表。
// The first call returns a valid data object like this one (example for 10 ids per page):
// { "mostRecent" : [ 156, 161, 169, 178, 179, 181, 182, 183, 192, 203 ], "total" : 1653 }
// The second time returns a similar object but with an empty array of size 10, as follows:
// { "mostRecent" : [], "total" : 1653 }
此控制器功能调用与我的服务器通信的Photo服务。
app.controller( 'PhotoManagerController', [ '$scope', '$q', 'Photo', function ( $scope, $q, Photo ) {
/**
* Returns a serie of ids for the page.
* @param params Parameters for the AJAX call (pagination, etc...)
* @param init whether it is the first time the function is called or not.
* @return a promise returning the ids.
*/
var retrieveIds = function ( params, init ) {
return Photo.getIds( params.pagination )
.then( function ( response ) {
// At this point, the data is valid the first time and incomplete the second time.
if ( init ) { total = response.data.total; }
var loadedIds = response.data.mostRecent;
return $q( function ( resolve ) { resolve( loadedIds ); } );
} );
};
} );
照片服务:
app.factory( 'Photo', [ '$http', '$q', 'SERVER_ROUTES', function ( $http, $q, SERVER_ROUTES ) {
return {
getIds : function ( pagination ) {
var params = {};
if ( pagination ) {
params.params = { 'c' : pagination.c, 'p' : pagination.p };
}
return $http.get( url + SERVER_ROUTES.PHOTO.GET_IDS, params );
}
};
} );
我检查了各种各样的事情:
经过分析,我认为问题来自于$ http 的transformResponse对象。我将查询更改为使用$ http({})和transformResponse参数,并在此函数中看到对第二个调用DID的响应首先包含具有完整数组ID的预期对象。
我不知道问题的根源是什么,主要是考虑到它第一次运作良好。我想这是由$ http的默认transformResponse函数之一引起的,但是哪一个?
答案 0 :(得分:1)
回答有点晚:-)
对于可能遇到类似问题的任何人:问题是由多种原因引起的,即我公司当时使用的Firefox版本(46.7,从46.9版本开始问题消失)和中央身份验证服务(CAS) 用于登录该公司生产的软件。
当后来的应用程序表现出类似的行为时,它通过预先对有问题的请求进行初步的 AJAX 调用来解决。