有关transFormRequest函数/数组的详细解释,请参阅here的已接受答案。
在答案的最后一个例子中:
var transform = function(data){
return $.param(data);
}
$http.post("/foo/bar", requestData, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
transformRequest: transform
}).success(function(responseData) {
//do stuff with response
});
然而,问题是transformRequest: transform
会覆盖Angular预先构建的函数数组。
来自Angular docs:
要全局扩充或覆盖默认转换,请修改$ httpProvider.defaults.transformRequest和$ httpProvider.defaults.transformResponse属性。默认情况下,这些属性是一个转换函数数组,允许您将新转换函数推送或取消转换到转换链中。您还可以通过直接将转换函数分配给这些属性来决定完全覆盖任何默认转换,而无需使用数组包装器。这些默认值在运行时在$ http工厂中再次可用,如果您希望参与转换,则这可能很有用。
同样,要在本地覆盖请求/响应转换,请扩充传递到$ http的配置对象的transformRequest和/或transformResponse属性。
如果我想全局应用我的转换函数,我会做
$httpProvider.defaults.transformRequest.unshift(myFunction)
或
$httpProvider.defaults.transformRequest.push(myFunction)
我的问题
如何将另一个转换函数推送到调用而不是全局?而不是擦除整个转换请求函数数组?
答案 0 :(得分:17)
我使用.concat
方法
{
transformRequest: [function(req){...}].concat($http.defaults.transformRequest)
}
或者,如果您希望自定义转换发生在角度的默认转换之后。
{
transformRequest: $http.defaults.transformRequest.concat([function(req){...}])
}
答案 1 :(得分:3)
Angular,在文档中提出了这个建议:
$httpProvider.defaults.transformRequest = appendTransform($httpProvider.defaults.transformRequest, function(data) {
//do whatever you want
return data;
});
function appendTransform(defaults, transform) {
// We can't guarantee that the default transformation is an array
defaults = angular.isArray(defaults) ? defaults : [defaults];
// Append the new transformation to the defaults
return defaults.concat(transform);
}
答案 2 :(得分:1)
以下是另一个解决方案:
.config(function($httpProvider) {
$httpProvider.defaults.transformRequest = function(data) {
var query = '', name, value;
if (data instanceof Object) {
for(key in data) {
name = key;
value = data[key];
query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
}
return query;
} else {
return data;
}
};
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
})
希望有所帮助