2012-10-04 35 views
9

Tôi sử dụng Angular $resource cho dịch vụ REST. Do sự lừa đảo trong phản hồi của tôi, tôi không thể sử dụng dịch vụ tài nguyên $ cho ứng dụng CRUD.

Tạo một tác phẩm đối tượng mới (nói cho Card), smilar để:

var newCard = new CreditCard(); 
newCard.name = "Mike Smith"; 
newCard.$save(); 

Get cũng làm việc:

var card = CreditCard().get({_id:1) 

Nhưng, phản ứng GET không phải là đối tượng Card chính nó, nhưng khác tin nhắn với nó (đối tượng bao bọc)

{ message: ".....", 
    response: Card //object 
} 

vì vậy khi tôi lưu truy xuất mẫu ved thông qua tài nguyên, nó sẽ gửi đối tượng bao bọc (với đối tượng Thẻ đã sửa đổi trong trường phản hồi). Điều này có thể đúng, nhưng máy chủ của tôi mong đợi đối tượng Thẻ không phải là trình bao bọc. Có cách nào để tùy chỉnh $ tài nguyên để nó gửi đối tượng mong muốn không. Từ tài liệu, có vẻ như chỉ có thể thay đổi thông số url.

$resource(url[, paramDefaults][, actions]); 
+0

Bạn có thể đăng một ví dụ hoàn chỉnh về jsfiddle hoặc tương tự không? Theo kinh nghiệm của tôi, CRUD (đơn giản) không cần thiết phải tạo ra một đối tượng mới như thế. Điều gì sẽ xảy ra nếu bạn chỉ truy cập vào tài nguyên của mình như $ scope.card = Card.get ({_ id: 1), trong đó Thẻ là dịch vụ tài nguyên của bạn? Ngoài ra, nếu bạn nói với mẫu của bạn những gì mô hình của bạn là, dụ được tự động dân cư. – Narretz

+0

Tôi không nghĩ rằng vấn đề của bạn là ở Góc. Âm thanh gần giống như việc triển khai REST của bạn ở phía máy chủ có một số vấn đề. Không nên có một tin nhắn gắn liền với nó. Bạn có thể muốn kiểm tra điều đó trước để đảm bảo rằng phần thân của phản hồi chỉ là đối tượng bạn đang mong đợi. –

+0

Máy chủ thực sự đang gửi một trình bao bọc xung quanh đối tượng thực tế. Tuy nhiên, là có một cách để gửi chỉ các đối tượng khi gửi lại cho máy chủ (POST) – bsr

Trả lời

17

Tôi cũng gặp sự cố với việc triển khai chuẩn trong mô-đun tài nguyên $. Trong một thời gian, tôi chỉ thực hiện các chỉnh sửa trong bản sao cục bộ của tập tin tài nguyên $, nhưng tôi thấy rằng tôi vẫn không hài lòng với cách họ triển khai các tài nguyên REST. Tôi cần sự linh hoạt hơn được cung cấp.

Mô-đun tiêu chuẩn $resource chỉ là trình bao bọc nhà máy khoảng $ http. Nếu bạn đun sôi mã trong mô-đun $ resource, bạn có thể tạo việc triển khai tùy chỉnh của riêng bạn khá dễ dàng.

var app = angular.module('app', []); 

app.factory('CreditCard', ['$http', function($http) { 

    function CreditCardFactory() { 

     function parseMessage(message) { 
      if (message.response) { 
       return message.response; 
      } 
     } 

     function CreditCard(value) { 
      angular.copy(value || {}, this); 
     } 

     CreditCard.$get = function(id) { 
      var value = this instanceof CreditCard ? this : new CreditCard(); 
      $http({ 
       method: 'GET', 
       url: '/creditcards/' + id 
      }).then(function(response) { 
       var data = response.data; 
       if (data) { 
        angular.copy(parseMessage(data), value); 
       } 
      }); 
      return value; 
     }; 

     CreditCard.prototype.$get = function(id) { 
      CreditCard.$get.call(this, id); 
     }; 

     return CreditCard; 

    } 

    return CreditCardFactory; 

}]); 

Sau đó, trong chức năng điều khiển của bạn, hãy tiêm nhà máy thẻ tín dụng giống như bạn sẽ tài nguyên $.

app.controller('CreditCardCtrl', function($scope, CreditCard) { 
    $scope.creditCard = CreditCard().get(3); 
}); 

Điều này cho phép bạn phân tích cú pháp các phản hồi của các hành động REST bạn muốn và cũng cho phép bạn thực hiện bất kỳ hành động nào bạn muốn. Ví dụ: Tôi muốn một phương thức lưu trên tài nguyên của tôi sẽ kiểm tra xem đối tượng có thuộc tính id hay không trước khi chọn sử dụng POST (tạo tài nguyên mới khi không có id) hoặc PUT (cập nhật tài nguyên hiện có khi id hợp lệ có sẵn).

Điều này cũng sẽ cho phép bạn thực hiện một cách xử lý khác nhau JSON CSRF Vulnerability. Cách angular.js được xây dựng thành $ http, nhưng API REST của công ty tôi khắc phục vấn đề này bằng cách bao bọc các mảng JSON trong một đối tượng giả. Tôi sử dụng một tài nguyên tùy chỉnh như một ở trên để phân tích đối tượng giả.

+0

cảm ơn. Tôi cũng đang suy nghĩ dọc theo dòng. – bsr

+0

Đây là một phản ứng tuyệt vời Brett, cảm ơn. Tôi càng làm việc với tài khoản '$ resource' càng cao, tôi càng thấy mong muốn viết một trình bao bọc tùy chỉnh trên đỉnh' $ http'. – quickshiftin

+0

sử dụng phương pháp này, bạn cần phải thực hiện các phương thức save(), delete() vv của riêng bạn, đúng không? – JBCP

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