2015-01-26 10 views
11

Theo mặc định, $resource.query() được thiết lập để mong đợi một mảng đối tượng trở thành đối tượng $resource. Để thích ứng với phân trang trong một cách yên tĩnh thoải mái, tôi đã GET /api/widgets endpoint tôi thành lập để trả lại đối tượng sau đây:

{ 
    currentPage: 1, 
    perPage: 20, 
    totalItems: 10039, 
    items: [{...}, {...}, {...}] 
} 

Có cách nào để làm cho nó để góc sẽ biết rằng items tài sản là mảng các mục là $resource đối tượng?

Trả lời

22

Bạn cần phải xác định hành động tùy chỉnh của riêng bạn.

Tôi tưởng tượng mã của bạn trông giống như sau:

factory('Widget', function($resource) { 
    return $resource('/api/widgets'); 
}); 

Thay đổi nó như thế này:

factory('Widget', function($resource) { 
    return $resource(/api/widgets, null, { 
    query: { 
     method: 'GET', 
     isArray: true, 
     transformResponse: function(data) { 
     return angular.fromJson(data).items; 
     } 
    } 
    }); 
}); 
+0

Điều này làm việc tuyệt vời! –

+0

Vì vậy, với cách tiếp cận này, làm cách nào để tôi có quyền truy cập vào thông tin phân trang từ bên ngoài phương thức transformResponse? Bạn đã chắc chắn đã trả lời câu hỏi gốc, nhưng bây giờ tôi có một vấn đề mới :) –

+0

Không hoàn toàn chắc chắn, nhưng bạn có thể thử này 'var widgets = Widget.query(); widget. $ promise.then (hàm (dữ liệu) {console.log (dữ liệu);}); '. –

2

dễ dàng là là sử dụng $resouce.get, nếu bạn wan để sử dụng truy vấn mà bạn có thể ghi đè behaivor đó.

$resource('/notes/:id', null, 
{ 
    'query': {method:'GET', isArray:false} 
}); 

chi tiết https://docs.angularjs.org/api/ngResource/service/ $ nguồn

+0

Điều này không giải quyết được sự cố của tôi. Toàn bộ đối tượng phản hồi sẽ là '$ resource' và cố gắng gọi' $ save' hoặc '$ update' sẽ cố gắng duy trì các giá trị không phải là một phần của mô hình tài nguyên thực tế. Tôi cần phải cấu hình '$ resource.query()' để biết rằng các đối tượng tài nguyên thực sự được chứa trong mảng 'items' của phản hồi. –

+0

Tôi đã làm điều này, và làm việc cho tôi, tôi không thấy làm thế nào nó sẽ không hoạt động, khi bạn gọi cập nhật, bạn sẽ speciy id và đối tượng mới, tôi không thấy làm thế nào nó sẽ không hoạt động 'myresource.update ({id: 1 } {propery1: 1, property2: 2}) ' –

+0

Điều này sẽ hoạt động nếu tôi sử dụng' $ resource' đúng như một cơ chế để xây dựng các yêu cầu và nhận được một đối tượng phản hồi, tuy nhiên, có thêm các tính năng của '$ resource' không được hiểu rộng rãi. Cụ thể, (các) đối tượng được trả về bởi một thiết bị đầu cuối REST sẽ trở thành các đối tượng '$ resource'. Trong trường hợp của tôi, tôi cần một cách để nói với góc cạnh rằng thuộc tính 'list' của đối tượng trả về là các tài nguyên thực tế. Xem câu trả lời được chấp nhận. –

0

Tôi chỉ có cùng một vấn đề, và tôi muốn đề xuất một giải pháp mà có thể là một tốt hơn một chút:

factory('Widget', function($resource) { 
    return $resource(/api/widgets, null, { 
     query: { 
      interceptor: { 
       response: function(response) { 
        return response.data.items; 
       } 
      } 
     } 
    } 
} 

Tôi nghĩ có thể tốt hơn, vì bạn đang sử dụng lại hành vi góc chuẩn iour (thực tế, thực hiện nhiều hơn một chút so với fromJson) và chặn kết quả đầu ra để lọc những gì bạn muốn.

0

tôi sử dụng mô hình này để truy vấn với thông tin phân trang.

module.config(function($resourceProvider){ 
    $resourceProvider.defaults.actions.query = { 
     method: 'GET', 
     interceptor: { 
      response: function(response) { 
       response.resource.$totalCount = response.data.totalCount; 
       response.resource.$limit = response.data.limit; 
       response.resource.$offset = response.data.offset; 
       return response.resource; 
      } 
     }, 
     transformResponse: function(data, headers, status) { 
      var out = angular.fromJson(data); 
      out.data.totalCount = out.totalCount; 
      out.data.limit = out.limit; 
      out.data.offset = out.offset; 
      return out.data; 
     }, 
     isArray: true 
    }; 
}) 
Các vấn đề liên quan