2012-03-01 29 views
12

Tôi đã bắt đầu thử nghiệm với Backbone.js và đã bị ấn tượng bởi tài liệu về tài liệu cho thuộc tính url trên Backbone.Model.Sử dụng HATEOAS và Backbone.js

Cụ thể, tôi đang xây dựng một API REST sử dụng HATEOAS/hypermedia để điều khiển (các) ứng dụng khách.

Tôi có thể thấy tính hữu ích của hành vi mặc định của Backbone khi tự xây dựng URL cho các mục trong bộ sưu tập, nhưng đối với trường hợp của tôi, muốn có các URL mô hình được tạo từ dữ liệu được phân tích cú pháp.

Có ai đã mở rộng/xây dựng trên Backbone để làm điều này không? Có thể xây dựng dựa trên "tiêu chuẩn" như HAL?

EDIT:

Để làm rõ, chúng ta hãy nói rằng tôi có như sau:

GET/đơn đặt hàng >>

[ 
    { 
    "_links": { 
     "self": "/orders/123" 
    } 
    "name": "Order #123", 
    "date": "2012/02/23" 
    }, 
    { 
    "_links": { 
     "self": "/orders/6666" 
    } 
    "name": "Order #666", 
    "date": "2012/03/01" 
    }, 
] 

và tôi có một mô hình theo thứ tự như sau:

var Order = Backbone.Model.extend({ 
}); 

Tôi muốn số url tài sản được tự động kéo ra khỏi tham chiếu "tự" trong HAL. Tôi nghĩ rằng tạo mô hình cơ sở mới giống như (chưa được kiểm tra):

var HalModel = Backbone.Model.extend({ 
    url: function() { 
    return get("_links").self; 
    }, 
}); 

Suy nghĩ?

+0

Bạn có nói rằng nếu bạn có một mô hình đặt hàng mà bạn muốn Url được đặt tự động thành 'order/{orderid}' và nếu bạn có mô hình khách hàng, cùng một mã sẽ đặt nó thành 'customer/{customerid } '? – timDunham

+0

@timDunham Xem chỉnh sửa của tôi để được giải thích rõ hơn. – Pete

Trả lời

4

Cảm ơn bạn đã làm rõ @Pete.

Tôi nghĩ rằng tôi thấy những gì bạn đề xuất và tôi cho rằng nó có thể hoạt động. Tuy nhiên, trong ví dụ của bạn, trước tiên bạn phải biết địa chỉ /Orders trước khi bạn có thể nhận được đơn đặt hàng. Và nếu bạn reworked json của bạn để có một tài sản id, bạn sẽ được khá gần với việc thực hiện mặc định của xương sống.

Bây giờ, nếu bạn chỉ muốn sử dụng mô hình hoặc mô hình cơ bản chung (ví dụ: HALModel) và chỉ khởi động nó bằng dữ liệu, cách tiếp cận của bạn có thể hữu ích và chắc chắn có thể hoạt động. Tuy nhiên, tôi sẽ nhìn vào trọng parse để kéo url ra và đặt nó trên mô hình:

parse: function(response) { 
    this.url = response._links.self; 
    delete response._links; 
    return response; 
} 
+0

Có, biết URL/đơn đặt hàng đến từ GET đến URL cơ sở cho dịch vụ, sử dụng cách tiếp cận HATEOAS sẽ trả về các liên kết cho tất cả các tài nguyên có sẵn: GET/>> {"_links": {"urn: mysite. com: orders ":"/orders "} – Pete

+0

Tôi thích sử dụng chức năng phân tích cú pháp. Tôi có cần phải chuỗi lên đến phương pháp phân tích cơ sở với Backbone.Model.prototype.parse.call (điều này, phản ứng); ? – Pete

+1

Không cần thiết phải xích lại. Theo mặc định 'parse' return' response'. – timDunham

1

Bạn có thể ghi đè hàm url trên mô hình để tính URL tuy nhiên bạn muốn; nó hoàn toàn có thể mở rộng.

+0

Vâng, tôi đã nhìn thấy tôi có thể ghi đè nó theo cách thủ công cho một mô hình cụ thể. Tôi tò mò nếu có ai có cách tiếp cận chung/tái sử dụng hơn họ đã thực hiện. – Pete

2

Tôi bổ sung vào đây câu trả lời của Simon để giải thích cách dễ dàng thực hiện việc đó bằng cách sử dụng gomoob/backbone.hateoas.

// Instanciation of an Hal.Model object is done the same way as you're 
// used to with a standard Backbone model 
var user = new Hal.Model({ 
    firstName: "John", 
    lastName: "Doe", 
    _links: { 
     avatar: { 
      href: "http://localhost/api/users/1/avatar.png" 
     }, 
     self: { 
      href: "http://localhost/api/users/1" 
     } 
    }, 
    _embedded: { 
     address: { 
      "city" : "Paris", 
      "country" : "France", 
      "street" : "142 Rue de Rivoli", 
      "zip" : "75001", 
      "_links" : { 
       "self" : { 
        "href" : "http://localhost/api/addresses/1" 
       } 
      } 
     } 
    } 
}); 

// Now we you can easily get links, those lines are equivalent 
var link1 = user.getLink('avatar'); 
var link2 = user.getLinks().get('avatar'); 

// So getting self link is simple too 
var self = user.getLink('self'); 

// All the Hal.Link objects returned by backbone.hateoas are in fact 
// standard Backbone models so its standard Backbone 
link1.get('href'); 
link1.getHref(); 

// You can do more with shortcut methods if your HAL links 
// have more properties 
link1.get('deprecation'); 
link1.getDeprecation(); 
link1.get('name'); 
link1.getName(); 
link1.get('hreflang'); 
link1.getHreflang(); 
link1.get('profile'); 
link1.getProfile(); 
link1.get('title'); 
link1.getTitle(); 
link1.get('type'); 
link1.getType(); 
linke1.get('templated'); 
link1.isTemplated(); 

// You can also manipulate embedded resources if you need 
user.getEmbedded('address').get('city'); 
user.getEmbedded('address').getLink('self'); 
... 

Cuối cùng, chúng tôi cung cấp triển khai Hal.Model.url() mạnh mẽ hơn url chuẩn đường trục() và rất hữu ích nếu bạn sử dụng HAL.

// By default url() returns the href of the self link if this self 
// link is present 
user.url(); 

// If the self link is not defined then url() has the same behavior 
// as standard Backbone url() method 
// My user is link to a user collection having a URL equal to 
// 'http://localhost/user1' 
user.url(); // http://localhost/users/1 

// My user is not link to a user collection in this case the URL is 
// generate using the model urlRoot property by default 
user.urlRoot = 'http://myserver/users'; 
user.url(); // http://localhost/users/1 

// backbone.hateoas also allows you to define an application wide root 
// URL which prevent to use absolute URLs everywhere in your code 
Hal.urlRoot = 'http://localhost/api'; // HAL root API URL 

var user = new Hal.Model({ id : 1}); 
user.urlMiddle = 'users'; 
user.url(); // http://localhost/api/users/1 

Hy vọng điều này sẽ giúp, đừng ngần ngại đăng sự cố trên github của chúng tôi nếu bạn cần trợ giúp về vấn đề này.

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