$.param
jQueryの戻り値の形式でクエリ文字列を理解するバックエンドがあります。たとえば、次のようなオブジェクトを持つ
{ 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 クラスのその部分をオーバーライドする賢い方法はありますか?