4

$.paramjQueryの戻り値の形式でクエリ文字列を理解するバックエンドがあります。たとえば、次のようなオブジェクトを持つ

{ 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

私のバックエンドが理解していません。

この他の質問を読んで、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 に答える