2013-08-09 25 views
11

Tôi nhận được một hành vi kỳ lạ với $ http của AngularJS và không thực sự hiểu cách transformResponse hoạt động (các tài liệu có chút sáng trên cái này).

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

Các api trả về một mảng các đối tượng:

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

Nhưng khi transformResponse đã làm nó kinh doanh ác dữ liệu đã chuyển đổi thành một đối tượng được lập chỉ mục:

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

tôi muốn giữ cấu trúc dữ liệu gốc (một mảng các đối tượng).

+0

Bạn có thể muốn có một cái nhìn ở đây: http://stackoverflow.com/questions/17134401/angular-extending-resource-subobject-with-custom-methods – AlwaysALearner

+0

Họ đang sử dụng tài nguyên $, tôi đang sử dụng $ http –

Trả lời

14

Để bắt đầu không chuyển đổi dữ liệu của bạn thành đối tượng, bạn cần ghi đè hành vi của $ httpProvider.defaults.transformResponse mặc định. Nó thực sự là một loạt các máy biến áp. Bạn chỉ có thể đặt nó vào được trống: $http.defaults.transformResponse = []; Dưới đây là một biến Ví dụ: Tôi đã sử dụng để chuyển đổi 64-bit ints dài để xâu:

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

Để thêm một biến vào danh sách mặc định, nói trước JSON deserializer, bạn có thể làm điều này:

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

Resource 0: "f" 1: "a" 2: "l" 3: "s" 4: "e" này cuối cùng làm việc cho tôi:

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

Hãy thử sử dụng phương pháp truy vấn nguồn

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

+1

Bạn có thể mở rộng câu trả lời của mình bằng một số mã ví dụ không? Nó luôn luôn rõ ràng hơn để xem mã và mô tả. Bạn có thể [sửa] câu trả lời của bạn. Nhân tiện, tại sao bạn tạo hai tài khoản? –

+1

Tôi nghĩ những gì bạn cần làm là thông báo cho $ http rằng bạn đang trả về mảng thay vì một đối tượng –

Các vấn đề liên quan