2012-04-25 12 views
6

Estoy tratando de representar un elemento al inicio de una colección (imagínese si estaba publicando un nuevo registro en Facebook)Backbone (Marionette) tratando de mostrar un nuevo registro al inicio de una colección, sin volver a procesar toda la colección

Cuando llego a agregar (respuesta, {at: 0}); en la colección, el registro se inserta correctamente en 0 en la colección, pero se representa en la parte inferior de la lista de elementos. Estoy confundido ya que tenía este funcionamiento antes, pero creo que lo que estaba haciendo en un estilo hacky, simplemente se restableció y re-renderizar la colección.

Me pregunto cuál es la manera ordenada de manejar esto, y dónde debo unir la lógica.

¿Está en el método de agregar de la colección? Actualmente esto está vacío (pero estoy usando Marionette) y creo que esto anula la representación predeterminada de la red troncal. ¿Cómo puedo tomar el control de nuevo, así puedo obtener mi nuevo elemento para agregarlo correctamente a la lista, sin destruirlo todo y volver a crearlo?

Respuesta

12

En Marionette, la manera predeterminada de agregar un nuevo elemento a una colección en las vistas, es usar el método append de jQuery. El tipo CollectionView tiene un método llamado appendHtml que se utiliza para hacer el agregado real. (Consulte http://derickbailey.github.com/backbone.marionette/docs/backbone.marionette.html#section-24)

Sin embargo, puede anular fácilmente este método en su vista de colección específica, y tener el nuevo modelo adjunto donde sea que deba ir.

En su caso, si siempre está deseando anteponer el nuevo modelo a la parte superior de la lista, es muy trivial para cambiar la vista de colección para hacer esto:

Backbone.Marionette.CollectionView.extend({ 
    appendHtml: function(cv, iv){ 
    cv.$el.prepend(iv.el); 
    } 
}); 

Tenga en cuenta que cv es la colección ver instancia y iv es la instancia de vista de elemento para el modelo en la colección.

Si necesita hacer cosas más complicadas, como encontrar una posición exacta en la colección existente de nodos HTML, puede hacerlo dentro de la función appendHtml también. Por supuesto, esto se vuelve más complicado que solo hacer un pre-envío en lugar de un apéndice, pero aún es posible.

Espero que ayude.

+0

Gracias por la respuesta, definitivamente creo que esto será útil para seguir adelante! –

+0

@ChrisBarry también ver el hilo en https://github.com/derickbailey/backbone.marionette/issues/78 para una forma de insertar un artículo en orden en una colección procesada. –

+0

Pero reemplazar append con prepend cambiará el orden al renderizar, ¿no? – Herokiller

Cuestiones relacionadas