У меня есть серверная часть, которая понимает строки запроса в формате 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
Что мой бэкэнд не понимает.
Чтение этот другой вопрос, я думал, что использование 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;
});
}]);
Однако при попытке запустить этот код вы заметите, что атрибут данных в transformFn
всегда не определен, а строка запроса остается в формате AngularJS.
Вы также можете увидеть это в jsFiddle: http://jsfiddle.net/fcoury/QKmnX/
Есть идеи, как заставить строку запроса использовать формат jQuery $.param?
EDIT: я проверял код AngularJS для ветки v1.0.x и не смог найти способ изменить код построения строки запроса, который происходит здесь:
https://github.com/angular/angular.js/blob/v1.0.x/src/ngResource/resource.js#L299-L306
Есть ли у кого-нибудь умный способ переопределить эту часть класса ngResource?