2012-06-19 19 views
15

Estoy diseñando una API y también consumiéndola con Backbone.js. Parte de la API incluirá operaciones de búsqueda. Por ejemplo en la búsqueda de coches, que podría tener algo como:Cómo diseñar una búsqueda REST con backbone

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

Con columna vertebral, puedo ver dos opciones para el consumo de los resultados.

Opción 1: Una búsqueda es una colección

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

Opción 2: Una búsqueda es un modelo, y los resultados son una colección

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

¿Cuáles son las ventajas/desventajas de estas opciones ? ¿Hay una forma básica de diseñar esto?

Me estoy inclinando hacia la opción 2 porque parece más fácil agregar cosas a la respuesta como detalles de paginación, o una próxima url. Pero la opción 2 parece más desordenada de dos maneras. Por ejemplo, ¿generaría una ID en el servidor para el modelo de búsqueda cuando se guarde? No creo que necesite obtener ese modelo por ID, borrarlo o actualizarlo realmente no tiene sentido, ya sea porque no lo estoy persistiendo.

Respuesta

5

Me gustaría ir con la opción uno. Al menos, un modelo debe corresponder a un único resultado de búsqueda y la colección a todo el conjunto de resultados de búsqueda. por lo tanto, si busca volvo y se devuelven 6 elementos, cada artículo debe ser un modelo contenido en su colección.

Ahora esto dependerá en gran medida de cómo se representa un resultado en su servidor. Si, por ejemplo, tiene instancias de automóvil, entonces simplemente hace el lado del servidor de búsqueda utilizando la consulta y devuelve los objetos resultantes como json. Luego puede hacer que la lista devuelta sea la colección de modelos de automóviles que coinciden con los criterios. pero si está planeando devolver los resultados de la consulta de otra manera, entonces tendrá que pensar cómo debería representar el modelo los datos

10

no sé si es una buena práctica, pero uso para mi búsqueda los "datos" "opción en el método" buscar ".

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

Tal vez esto ayude. ¡Buena suerte!

EDITAR

Esta es la forma correcta de pasar parámetros de consulta en su colecciones url, The reference to the Docs muestra cómo pasar los datos de atributo en ir a buscar opciones, el atributo de datos es en realidad un objeto con pares de valores clave refiriéndose para consultar parámetros y sus valores

+3

esto es en realidad la respuesta correcta. –

0

Recomendaría usar una colección, como en la opción 1, pero sin la necesidad de definir una nueva colección solo para la búsqueda.

Tome un vistazo a mi post sobre esto aquí: 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(); 
    } 

}); 

entonces usted puede hacer:

var Cars = SearchableCollection.extend({}); 

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