4

我有一个后端可以理解 jQuery$.param返回格式的查询字符串。例如,有一个像

{ search: "Miller", name: ["Felipe", "Fernanda"] }

将使用以下查询字符串请求 URL:

http://theurl/path?search=Miller&name%5B%5D=Felipe&name%5B%5D=Fernanda 

基本上它使用name[]=Felipe&name[]=Fernada,但 URL 编码。

同一个对象,当被 AngularJS 解析时以这种格式结束:

http://theurl/path?search=Miller&name=Felipe,Fernanda

我的后端不明白。

阅读this other question,我认为使用 transformRequest 会有所帮助,但事实并非如此。这是我的测试代码:

HTML

<div ng-controller="UserCtrl">
    <pre>{{ data | json}}</pre>
</div>

JavaScript

var myApp = angular.module('myApp',['ngResource']);

var transformFn = function(data, headersGetter) {
    console.debug('transformRequest', data);
    if (!data) return;
    console.debug('data in', data);
    var dataOut = $.param(data);
    console.debug('data out', dataOut);
    return dataOut;
};

myApp.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.transformRequest.push(transformFn);
}]);

myApp.factory('User', ['$resource', function($resource) {
    return $resource('/echo/:type/', {type:'json'}, {
        query: { method: 'GET' }
    });
}]);

myApp.controller('UserCtrl', ['$scope', 'User', function($scope, User) {
    User.query({ seach: 'Miller', name: ['Felipe', 'Fernanda']}, 
       function(data) {
           console.debug('data', data);
           $scope.data = data;
       });
}]);

但是,当您尝试运行此代码时,您会注意到 data 属性transformFn始终未定义,并且查询字符串保持为 AngularJS 格式。

您也可以在 jsFiddle 中看到这一点:http: //jsfiddle.net/fcoury/QKmnX/

知道如何强制查询字符串使用 jQuery 的 $.param 格式吗?

编辑:我正在检查分支 v1.0.x 的 AngularJS 代码,但找不到任何更改查询字符串构造代码的方法,这发生在这里:

https://github.com/angular/angular.js/blob/v1.0.x/src/ngResource/resource.js#L299-L306

有没有人有任何聪明的方法来覆盖 ngResource 类的那一部分?

4

2 回答 2

1

我的简单解决方案:

module.run(['$http', '$httpParamSerializerJQLike', function($http, $httpParamSerializerJQLike) {
  $http.defaults.paramSerializer = $httpParamSerializerJQLike;
}]);
于 2015-07-05T13:19:44.963 回答
0

你为什么使用推送?这里的例子只是分配:

$httpProvider.defaults.transformRequest = function(data) {...};
于 2012-12-30T19:24:55.293 回答