¿Existe alguna manera directa de insertar un nuevo artículo modelo en el medio de un backbone.js Collection
y luego actualizar el View
de la colección para incluir el nuevo elemento en la posición correcta?Insertar un elemento en una colección backbone.js
Estoy trabajando en un control para agregar/eliminar elementos de una lista. Cada elemento de la lista tiene su propio Model
y View
, y tengo View
para toda la colección.
Cada vista de elemento tiene un botón Duplicate
que clona el modelo del elemento y lo inserta en la colección en la posición de índice debajo del elemento al que se hizo clic.
Insertar el elemento en la colección fue sencillo, pero tengo problemas para averiguar cómo actualizar la vista de colección. He estado tratando de algo como esto:
ListView = Backbone.View.extend({
el: '#list-rows',
initialize: function() {
_.bindAll(this);
this.collection = new Items();
this.collection.bind('add', this.addItem);
this.render();
},
render: function() {
this.collection.each(this.addItems);
return this;
},
addItem: function (item) {
var itemView = new ItemView({ model: item }),
rendered = itemView.render().el,
index = this.collection.indexOf(item),
rows = $('.item-row');
if (rows.length > 1) {
$(rows[index - 1]).after(rendered);
} else {
this.$el.append(rendered);
}
}
}
Esta aplicación es una especie de trabajando, pero yo estoy errores extraños cuando agrego un nuevo elemento. Estoy seguro de que puedo resolverlos, pero ...
Hay una voz en mi cabeza que me dice que hay una mejor manera de hacerlo. Tener que averiguar manualmente dónde insertar un nuevo ItemView
parece realmente hacky. ¿No debería la vista de colección saber ya cómo deshacerse de la colección?
¿Alguna sugerencia?
Tuve que agregar una llamada a '(.item-row) .remove()' dentro del método 'render' para que funcione, pero es una buena solución. (De lo contrario, los elementos reintegrados se agregaron al final de los elementos renderizados existentes.) ¡Gracias por la ayuda! –
Oh, puedes hacer 'this. $ El.empty()' para borrar el '$ el' antes de pasar por la colección :) – sntran
Así es exactamente como estoy agregando elementos a la colección actualmente. Está colocando el nuevo artículo en el lugar correcto de la colección.Me di cuenta de que tengo un par de errores tipográficos en mi comentario anterior: llamo '$ ('. Item-row'). Remove()' para borrar los elementos que se crearon la última vez que se procesó la colección. Solo está restableciendo la vista. Ahora que lo pienso, hay un método de "reinicio" que puede hacer lo que quiero. Intentaré llamar y luego llamar a 'render'. –