2013-08-09 10 views
11

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":....} 

元のデータ構造(オブジェクトの配列)

+0

を使用してみてください:http://stackoverflow.com/questions/17134401/angular-extending-resource-subobject-with-custom-methods – AlwaysALearner

+0

彼らは$ resourceを使用しています、私は$ httpを使用しています –

答えて

14

データをオブジェクトに変換しないようにするには、デフォルトの$ httpProvider.defaults.transformResponseの動作をオーバーライドする必要があります。実際には変圧器の配列です。 $http.defaults.transformResponse = [];ここ は、私は文字列に64ビット長のint型に変換するために使用している例の変圧器である: あなたはちょうど空になるように設定でき

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

は、デフォルトのリストに変圧器を追加するには、先の言います

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

リソース0: "F" 1: "" 2: "L" 3: "S" 4: "E" これは最終的に私の仕事:

JSONのデシリアライザは、あなたがこれを行うことができます
transformResponse: function (data, headersGetter) { 
    return { isCorrect: angular.fromJson(data) } 
    } 
1

あなたがここを見てしたい場合がありますリソースクエリ方法

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

+1

あなたはいくつかのサンプルコードであなたの答えを広げることができますか?コードと説明を見ることは常に明確です。あなたはあなたの答えを編集することができます。ちなみに、なぜ2つのアカウントを作成しましたか? –

+1

私はあなたがする必要があると思うのは、オブジェクトの代わりに配列を返すことを$ httpに伝えることです –