2012-06-19 3 views
15

나는 API를 디자인하고 Backbone.js와 함께 소비하고있다. API의 일부에는 검색 작업이 포함됩니다. 나는 결과를 소비하는 두 가지 옵션을 볼 수 있습니다 백본으로백본을 사용하여 REST 검색을 설계하는 방법

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

: 자동차를 검색 할 때 예를 들어, 내가 좋아하는 뭔가가있을 수 있습니다.

옵션 1 : 검색하면 컬렉션을이다

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

옵션 2 : 검색은 모델이며, 결과는 컬렉션에게 있습니다

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

장점/이러한 옵션의 단점은 무엇입니까 ? 이것을 설계하는 중추적 인 방법이 있습니까?

페이지 넘김 세부 정보 또는 다음 URL과 같은 응답에 항목을 추가하는 것이 더 쉬운 것처럼 보이기 때문에 옵션 2쪽으로 기울어졌습니다. 그러나 옵션 2는 몇 가지 방법으로 더 복잡해 보입니다. 예를 들어 검색 모델 저장시 서버에 ID를 생성합니까? ID로 모델을 가져와야한다고 생각하지 마십시오. 모델을 삭제하거나 업데이트해도 실제로 유지하지 못할 수도 있습니다.

답변

5

옵션 1을 사용합니다. 최소한 모델은 단일 검색 결과에 해당하고 컬렉션은 전체 검색 결과 집합에 해당해야합니다. 따라서 volvo를 검색하고 6 개의 항목이 반환되면 각 항목은 컬렉션에 포함 된 모델이어야합니다.

이제는 서버에서 결과를 나타내는 방법에 따라 크게 달라집니다. 예를 들어 자동차 인스턴스가 있다고하면 검색어를 사용하여 검색 서버 측에서 json으로 결과 객체를 반환하면됩니다. 그런 다음 반환 된 목록을 조건과 일치하는 자동차 모델의 컬렉션으로 만들 수 있습니다. 하지만 쿼리 결과를 반환 할 계획이라면 모델이 데이터를 어떻게 표현해야하는지 생각해야합니다.

10

하지만 내 검색에는 "데이터 "옵션을 가져올 수 있습니다.

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

는 아마 도움이됩니다. 행운을 비네!

편집

이것은 당신의 컬렉션 URL에 쿼리 매개 변수를 전달하는 올바른 방법입니다, The reference to the Docs 데이터가 옵션을 가져 오기에 속성을 전달하는 방법을 보여줍니다, 데이터 속성은 실제로 키 값 쌍은 참조와 객체입니다 매개 변수와 해당 값을 쿼리하려면

+3

이 실제로 정답이다. –

0

옵션 1과 마찬가지로 컬렉션을 사용하는 것이 좋지만 검색을 위해 새 컬렉션을 정의 할 필요는 없습니다.

는 여기에 대해 내 블로그 게시물에서 살펴 보자 :

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

}); 

http://willdemaine.ghost.io/restful-search-with-backbone/ 그런 다음 당신이 할 수 있습니다

var Cars = SearchableCollection.extend({}); 

var findCars = Cars.search('volvo'); 
findCars.done(function(cars){ 
    var carsView = new CarsView({ 
    collection: cars 
    }); 
    carsView.render(); 
}); 
관련 문제