15

私は API を設計しており、Backbone.js でそれを使用しています。API の一部には、検索操作が含まれます。たとえば、車を検索する場合、次のようなものがあるとします。

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

バックボーンを使用すると、結果を使用するための 2 つのオプションが表示されます。

オプション 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 で取得する必要があるとは思わないでください。それを削除または更新することは、私がそれを保持していないため、実際には意味がありません。

4

3 に答える 3

10

良い習慣かどうかはわかりませんが、検索には「フェッチ」メソッドの「データ」オプションを使用します。

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

多分それは役立ちます。幸運を!

編集

これは、コレクション URL でクエリ パラメータを渡す正しい方法です。 ドキュメントへの参照は、フェッチ オプションでデータ属性を渡す方法を示しています。データ属性は、実際には、クエリ パラメータとその値を参照するキーと値のペアを持つオブジェクトです。

于 2012-06-20T06:02:31.520 に答える
5

私はオプション1で行きます。少なくとも、モデルは単一の検索結果に対応し、コレクションは検索結果のセット全体に対応する必要があります。したがって、ボルボを検索して6つのアイテムが返された場合、各アイテムはコレクションに含まれるモデルである必要があります。

これは、サーバーで結果をどのように表現しているかに大きく依存します。たとえば、車のインスタンスがある場合は、クエリを使用して検索サーバー側を実行し、結果のオブジェクトをjsonとして返します。次に、返されたリストを、基準に一致する車のモデルのコレクションにすることができます。ただし、クエリ結果を別の方法で返すことを計画している場合は、モデルがデータをどのように表すかを考える必要があります。

于 2012-06-19T18:09:23.117 に答える
0

オプション 1 のようにコレクションを使用することをお勧めしますが、検索のためだけに新しいコレクションを定義する必要はありません。

これに関する私のブログ投稿をご覧ください: 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();
  }

});

次に、次のことができます。

var Cars = SearchableCollection.extend({});

var findCars = Cars.search('volvo');  
findCars.done(function(cars){  
  var carsView = new CarsView({
    collection: cars
  });
  carsView.render();
});
于 2014-02-17T21:32:40.740 に答える