2012-06-19 14 views
15

Sto progettando un'API e la sto consumando anche con Backbone.js. Parte dell'API includerà le operazioni di ricerca. Per esempio durante la ricerca per le auto, potrei avere qualcosa di simile:Come progettare una ricerca REST con backbone

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

Con spina dorsale, posso vedere due opzioni per consumare i risultati.

Opzione 1: Una ricerca è una collezione

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

Opzione 2: Una ricerca è un modello, ed i risultati sono una raccolta

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

Quali sono i vantaggi/svantaggi di queste opzioni ? C'è un modo dorsale per progettare questo?

Sono inclinato verso l'opzione 2 perché sembra più semplice aggiungere elementi alla risposta come i dettagli di impaginazione o un prossimo URL. Ma l'opzione 2 sembra pacchiana in un paio di modi. Ad esempio, dovrei generare un ID sul server per il modello di ricerca quando viene salvato? Non penso di aver bisogno di ottenere quel modello per ID, cancellarlo o aggiornarlo non ha davvero senso, perché non lo sto perseverando.

risposta

5

Vorrei andare con l'opzione uno. Almeno un modello dovrebbe corrispondere a un singolo risultato di ricerca e la raccolta all'intero insieme di risultati di ricerca. quindi se cerchi Volvo e ci sono 6 oggetti restituiti, ogni oggetto dovrebbe essere un modello contenuto nella tua collezione.

Ora questo dipenderà in gran parte da come si rappresenta un risultato sul server. Se, ad esempio, si dispone di istanze di auto, basta eseguire la ricerca sul lato server utilizzando la query e restituire gli oggetti risultanti come json. Quindi puoi fare in modo che la lista restituita sia la collezione di modelli di auto che corrispondono ai criteri. ma se stai pianificando di restituire i risultati della query in un altro modo, dovrai pensare a come il modello dovrebbe rappresentare i dati

10

non so se è una buona pratica, ma io uso per la mia ricerca i "dati" "opzione nel metodo" fetch ".

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

forse aiuta. Buona fortuna!

EDIT

Questo è il modo giusto per passare i parametri di ricerca nella vostra collezioni URL, The reference to the Docs mostra come passare l'attributo dati in prendere le opzioni, l'attributo di dati è in realtà un oggetto con coppie di valori chiave riferiti per interrogare parametri e i loro valori

+3

questo è in realtà la risposta corretta. –

0

Raccomanderei l'utilizzo di una raccolta, come nell'opzione 1, ma senza la necessità di definire una nuova raccolta solo per la ricerca.

Date un'occhiata al mio blog post su questo qui: 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(); 
    } 

}); 

allora si può fare:

var Cars = SearchableCollection.extend({}); 

var findCars = Cars.search('volvo'); 
findCars.done(function(cars){ 
    var carsView = new CarsView({ 
    collection: cars 
    }); 
    carsView.render(); 
}); 
Problemi correlati