Вставка или возврат в массив 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