2011-05-10 11 views
16

Esto parece obvia, pero de alguna manera me falta ... queBackbone.js de drenaje se vars

¿Cómo se envía opciones junto con una colección Backbone.js fetch()?

O, desde un punto de vista más amplio: Tengo un gran conjunto de datos en el servidor, mensajes en este caso, que deseo hacer accesibles a través de una colección. Dado que podría haber miles de mensajes, no quiero simplemente buscarlos y almacenarlos a la vez, por lo que mi colección debería comprender al menos los límites y las compensaciones. Por no hablar de consultar listas filtradas u ordenadas.

¿Es una colección básica incluso la forma de manejar esto?

Saludos

Respuesta

31

he estado jugando con la columna vertebral de un par de días y me tuvieron que hacer frente a este problema casi de inmediato y miré a esta solución, pero me pareció torpe. Después de leer algunos documentos adicionales, descubrí que puedes anular cualquiera de las opciones jQuery.ajax dentro del método fetch(). Entonces, por ejemplo,

Posts = Backbone.Collections.extend({ 
    model: Post, 
    url: '/posts' 
}); 

Ahora cuando desee llamar a buscar simplemente envíele los parámetros que desee. p.ej.

var posts = new Posts(); 
posts.fetch({ data: { page: 3, pagesize: 10, sort: 'asc' } }); 

Esto producirá la siguiente petición:

http://yourdomain/posts?page=3&pagesize=10&sort=asc 

todas formas, sé que ya ha aceptado una respuesta, pero espero que esto ayude a alguien.

0

anular la función de "URL" de su colección y añadir los parámetros (? Parámetro = xyz).

El parámetro options de fetch también se puede usar ya que es el que se transfirió a la llamada jQuery ajax final. Entonces, si agrega un parámetro de "datos" allí, se usará.

1

Puede agregar un identificador a la url que pueda ser utilizado por el servidor para realizar una selección del envío de datos. P.ej.

var EventsCollection = Backbone.Collection.extend({ 

     model: Events, 

    }); 

    var eventCollection = new EventsCollection(); 
    eventsCollection.url = 'foo?offset=10&limit=20'; 
    eventsCollection.fetch(); 
6

Considere este código, donde al crear una instancia de su colección, pasa las preferencias para su compensación, límite o clasificación. La inicialización toma los valores predeterminados si no se proporcionan las preferencias. Y luego la función url los agrega a la llamada al servidor. A partir de entonces, tendría que actualizar potencialmente estos valores (probablemente solo el desplazamiento), al procesar las respuestas del servidor.

MessageList = Backbone.Collection.extend({ 

    initialize: function(models, options) { 
     options || (options = {}); 
     this.offset = options.offset || 0; 
     this.limit = options.limit || MessageList.DEFAULT_LIMIT; 
     this.sortBy = options.sortBy || MessageList.DEFAULT_SORTBY; 
    }, 

    url: function() { 
     return '/messages?' + 
       'offset=' + encodeURIComponent(this.offset) + '&' + 
       'limit=' + encodeURIComponent(this.limit) + '&' + 
       'sort_by=' + encodeURIComponent(this.sortBy); 
    }, 

    parse: function(response) { 
     // Parse models 
     // Parse offset, limit, sort by, etc 
    } 

}, { 

    DEFAULT_LIMIT: 100, 
    DEFAULT_SORTBY: 'name_asc' 

});