2012-06-19 29 views
15

Tôi đang thiết kế một API và cũng sử dụng nó với Backbone.js. Một phần của API sẽ bao gồm các hoạt động tìm kiếm. Ví dụ: khi tìm kiếm ô tô, tôi có thể có một cái gì đó như:Cách thiết kế tìm kiếm REST với xương sống

http://api.mysite.com/search/cars?q=volvo 

Với xương sống, tôi có thể thấy hai tùy chọn để tiêu thụ kết quả.

Lựa chọn 1: Một tìm kiếm là một Bộ sưu tập

var CarSearch = Backbone.Collection.extend({ 
    model: Car, 
    initialize : function(models, options){ 
     this.query = options.query; 
    }, 
    url: function(){ 
     return "http://api.mysite.com/search/cars?q="+this.query; 
    } 
}); 

var volvos = new CarSearch([], {query:'volvo'}); 
volvos.fetch(); 

Phương án 2: Một tìm kiếm là một mô hình, và kết quả là một Bộ sưu tập

var CarSearchResults = Backbone.Collection.extend({ 
    model: Car 
}); 

var CarSearch = Backbone.Model.extend({ 
    defaults: { 
     "query":"", 
     "carSearchResults":null 
    }, 
    url: function(){ 
     return "http://api.mysite.com/search/cars?q="+this.get('query'); 
    }, 
    parse: function(resp,xhr){ 
     resp.carSearchResults = new CarSearchResults(resp.carSearchResults); 
     return resp; 
    } 
}); 

var volvoSearch = new CarSearch(); 
volvoSearch.set({query:'volvo'}); 
volvoSearch.save(); 

những ưu điểm/nhược điểm của các tùy chọn này là gì ? Có một cách backbone-y thiết kế này?

Tôi đang hướng tới tùy chọn 2 vì có vẻ như dễ dàng thêm nội dung vào phản hồi như chi tiết phân trang hoặc url tiếp theo. Nhưng tùy chọn 2 có vẻ lộn xộn hơn theo một vài cách. Ví dụ, tôi sẽ tạo một ID trên máy chủ cho mô hình tìm kiếm khi nó được lưu? Đừng nghĩ rằng tôi cần để có được mô hình đó bằng ID, xóa hoặc cập nhật nó không thực sự có ý nghĩa, hoặc gây ra tôi không kiên trì nó.

Trả lời

5

Tôi sẽ sử dụng tùy chọn một. Ít nhất imo một mô hình phải tương ứng với một kết quả tìm kiếm và bộ sưu tập cho toàn bộ các kết quả tìm kiếm. vì vậy nếu bạn tìm kiếm volvo và có 6 mục được trả về, mỗi mục phải là một mô hình có trong bộ sưu tập của bạn.

Bây giờ điều này sẽ phụ thuộc phần lớn vào cách bạn đại diện cho kết quả trên máy chủ của mình. Nếu nói ví dụ bạn có trường hợp xe hơi sau đó bạn chỉ cần làm phía máy chủ tìm kiếm bằng cách sử dụng truy vấn và trả về các đối tượng kết quả là json. Sau đó, bạn có thể có danh sách trả về là tập hợp các mẫu xe phù hợp với tiêu chí. nhưng nếu bạn đang có kế hoạch trả về kết quả truy vấn theo một cách khác thì bạn sẽ phải suy nghĩ về cách mô hình đại diện cho dữ liệu

10

tôi không biết nếu thực hành tốt, nhưng tôi sử dụng để tìm kiếm "tùy chọn trong phương thức" tìm nạp ".

https://stackoverflow.com/a/6659501/1067061

Có thể giúp ích. Chúc may mắn!

EDIT

Đây là cách đúng đắn để vượt qua tham số truy vấn trong url bộ sưu tập của bạn, The reference to the Docs cho thấy làm thế nào để vượt qua thuộc tính dữ liệu trong lấy tùy chọn, thuộc tính dữ liệu thực sự là một đối tượng với các cặp giá trị key ám để truy vấn thông số và giá trị của chúng

+3

này thực sự là câu trả lời đúng. –

0

Tôi khuyên bạn nên sử dụng bộ sưu tập, như trong tùy chọn 1, nhưng không cần phải xác định bộ sưu tập mới chỉ dành cho tìm kiếm.

Hãy xem bài viết trên blog của tôi về vấn đề này ở đây: http://willdemaine.ghost.io/restful-search-with-backbone/

var SearchableCollection = Backbone.Collection.extend({},{ 

    search: function(query, options){ 
    var search = $.Deferred(); 
    options = options || {}; 
    var collection = new this([], options); 
    collection.url = _.result(collection, 'url') + 'search?q=' + query; 
    var fetch = collection.fetch(); 
    fetch.done(_.bind(function(){ 
     Backbone.Events.trigger('search:done'); 
     search.resolveWith(this, [collection]); 
    }, this)); 
    fetch.fail(function(){ 
     Backbone.Events.trigger('search:fail'); 
     search.reject(); 
    }); 
    return search.promise(); 
    } 

}); 

Sau đó, bạn có thể làm:

var Cars = SearchableCollection.extend({}); 

var findCars = Cars.search('volvo'); 
findCars.done(function(cars){ 
    var carsView = new CarsView({ 
    collection: cars 
    }); 
    carsView.render(); 
}); 
Các vấn đề liên quan