Подтвердить что ты не робот

AngularJS, $http и transformResponse

Я получаю странное поведение с AngularJS $http и не понимаю, как работает transformResponse (документы немного освещены на этом).

    WebAssets.get = function () {
        return $http.get('/api/webassets/list', {
            transformResponse: [function (data, headersGetter) {
                // not sure what to do here?!
                return data;
            }].concat($http.defaults.transformResponse) // presume this isn't needed, added for clarity
        }).then(function (response) {
            return new WebAssets(response.data);
        });
    };

Api возвращает массив объектов:

[{"webasset_name": "...", "application_id": "...", "etc": "..."}, ... ]

Но когда transformResponse сделал это злое дело, данные превратились в индексированный объект:

{"0":{"webasset_name":"...","application_id":"...", "etc": "..."}, "1":....}

Я хочу сохранить исходную структуру данных (массив объектов).

4b9b3361

Ответ 1

Чтобы получить angular, чтобы не преобразовать ваши данные в объект, вам необходимо переопределить поведение по умолчанию $httpProvider.defaults.transformResponse. На самом деле это массив трансформаторов. Вы можете просто установить его как пустую: $http.defaults.transformResponse = []; Вот пример трансформатора, который я использовал для конвертирования 32-битных длинных ints в строки:

function longsToStrings(response) {
    //console.log("transforming response");
    var numbers = /("[^"]*":\s*)(\d{15,})([,}])/g;
    var newResponse = response.replace(numbers, "$1\"$2\"$3");
    return newResponse;
}

Чтобы добавить трансформатор в список по умолчанию, скажем, перед десериализатором JSON, вы можете сделать это:

$http.defaults.transformResponse.unshift(longsToStrings);

Ответ 2

Ресурс 0: "f" 1: "a" 2: "l" 3: "s" 4: "e" Это, наконец, помогло мне:

   transformResponse: function (data, headersGetter) {
    return { isCorrect: angular.fromJson(data) }
    }