Натискане или премахване на преместване в масива transformRequest на $http (неглобален)

Вижте приетия отговор на тук за доста добро обяснение на функцията/масива transFormRequest.

В последния пример на отговора:

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 документи:

За да увеличите или замените глобално трансформациите по подразбиране, променете свойствата $httpProvider.defaults.transformRequest и $httpProvider.defaults.transformResponse. Тези свойства по подразбиране са масив от функции за трансформация, който ви позволява да натиснете или отмените преместването на нова функция за трансформация във веригата за трансформация. Можете също така да решите напълно да замените всички трансформации по подразбиране, като присвоите вашите функции за трансформация на тези свойства директно без обвивката на масива. Тези настройки по подразбиране отново са налични във фабриката $http по време на изпълнение, което може да е полезно, ако имате услуги по време на изпълнение, които искате да участвате във вашите трансформации.

По подобен начин, за да замените локално трансформациите заявка/отговор, увеличете свойствата transformRequest и/или transformResponse на конфигурационния обект, предаден в $http.

Ако исках да приложа моята трансформираща функция глобално, щях да го направя

$httpProvider.defaults.transformRequest.unshift(myFunction)

or

$httpProvider.defaults.transformRequest.push(myFunction)

Моят въпрос
Вместо да изтриете целия масив от функции за заявка за трансформация, как да изпратите друга функция за трансформация към повикване, а не глобално?


person NicolasMoise    schedule 14.02.2014    source източник


Отговори (3)


Намерих лесно решение с помощта на метода .concat

{
   transformRequest: [function(req){...}].concat($http.defaults.transformRequest)
}

или алтернативно, ако искате вашата персонализирана трансформация да се извърши след трансформациите по подразбиране на angular.

{
   transformRequest: $http.defaults.transformRequest.concat([function(req){...}])
}
person NicolasMoise    schedule 25.02.2014

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);
}
person jfcorugedo    schedule 20.08.2015

Ето още едно решение за това:

.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';

})

Дано е от помощ

person Victorino    schedule 13.12.2014