2013-08-09 17 views
11

Ho uno strano comportamento con $ http di AngularJS e non capisco davvero come funzioni transformResponse (i documenti sono un po 'chiari su questo).

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); 
     }); 
    }; 

L'API restituisce un array di oggetti:

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

Ma quando transformResponse ha fatto è business male i dati ha trasformato in un oggetto indicizzato:

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

voglio mantenere la struttura dati originale (una serie di oggetti).

+0

Si potrebbe desiderare di avere uno sguardo qui: http://stackoverflow.com/questions/17134401/angular-extending-resource-subobject-with-custom-methods – AlwaysALearner

+0

Stanno usando $ risorsa, sto usando $ http –

risposta

14

Per rendere angolare la conversione dei dati in un oggetto, è necessario ignorare il comportamento predefinito $ httpProvider.defaults.transformResponse. In realtà è una serie di trasformatori. Si potrebbe semplicemente imposta a essere vuoto: $http.defaults.transformResponse = []; Ecco un esempio del trasformatore che ho utilizzato per la conversione a 64 bit lunghe interi alle stringhe:

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

Per aggiungere un trasformatore per l'elenco predefinito, ad esempio in vista del JSON deserializzatore, si può fare questo:

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

Resource 0: "f" 1: "a" 2: "l" 3: "s" 4: "e" questo alla fine ha funzionato per me:

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

Prova utilizzando il metodo di query risorsa

https://github.com/angular/angular.js/issues/6314

+1

Puoi estendere la tua risposta con qualche codice di esempio? È sempre più chiaro vedere il codice e una descrizione. Puoi [modificare] la tua risposta. A proposito, perché hai creato due account? –

+1

Penso che quello che devi fare è informare il $ http che stai restituendo un array invece di un oggetto –

Problemi correlati