Estoy usando backbone.js para implementar una lista de amigos también conocida como Lista. Mi opinión columna vertebral de la colección Lista e individual rosterEntry
son los siguientes:Backbone.js: Eliminar un elemento de una colección
Slx.Roster.Views.RosterEntry = Backbone.View.extend({
tagName: "li",
className : "rosterEntry clearfix",
templateSelector: '#rosterEntryTemplate',
initialize: function() {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.model.bind('remove', this.remove);
this.template = _.template($("#rosterEntryTemplate").html());
},
remove: function() {
debug.log("Called remove event on model");
$(this.el).remove();
},
render: function() {
var renderedContent = this.template(this.model.toJSON());
this.id = this.model.Id;
$(this.el).attr('id', "friendid-" + this.model.get("id")).html(renderedContent);
return this;
}
});
Slx.Roster.Views.Roster = Backbone.View.extend({
el: "div#roster-container",
initialize: function() {
_.bindAll(this, 'render', 'add', 'remove');
this.template = _.template($("#rosterTemplate").html());
this.collection.bind('reset', this.render);
this.collection.bind('add', this.add);
this.collection.bind('remove', this.remove);
},
add: function (rosterEntry) {
var view = new Slx.Roster.Views.RosterEntry(
{
model: rosterEntry
});
$(this.el).append(view.render().el);
},
remove: function (model) { // if I ommit this then the whole collection is removed!!
debug.log("called remomve on collection");
},
render: function() {
var $rosterEntries, collection = this.collection;
$(this.el).html(this.template({}));
$rosterEntries = this.$('#friend-list');
_.each(collection.models, function (model) {
var rosterEntryView = new Slx.Roster.Views.RosterEntry({
model: model,
collection: collection
});
$(this.el).find("ul#friend-list").append(rosterEntryView.render().el);
}, this);
return this;
}
})
estoy probando por ahora el uso de la consola de Firebug y pueden poblar la plantilla bien ejecutando el siguiente:
collection = new Slx.Roster.Collection
view = new Slx.Roster.Views.Roster({collection:collection})
collection.fetch()
añadir a una colección también funciona bien, ejecutando el siguiente en la consola de Firebug:
collection.add(new Slx.Roster.Model({username:"mickeymouse"})
y se agrega el nuevo rosterEntry
a la lista.
Mi problema es que collection.remove(5)
se elimina de la colección en memoria, pero no hace nada para actualizar el DOM.
Extrañamente, si omito la función remove()
desde la Vista de lista, se eliminan todas las entradas en la lista. Si agrego este método con nada más que un registro de la consola, se llama el método de eliminación tanto en la lista como en las visitas de RosterEntry
, aunque no estoy seguro de por qué, pero están fuera de servicio.
["Called remove event on model"]
["called remomve on collection"]
si elimino la función de eliminación del modelo RosterEntry me sale este error:
TypeError: this.$el is undefined
this.$el.remove();
¿Qué estoy haciendo mal? ¿Cómo elimino el elemento del DOM cuando se elimina de la colección?
¿Qué quiere decir que tengo un problema con cada definición de vinculación de evenet? No estoy seguro de entender realmente qué es Bindall para ser honesto con usted. Solo pensé que todos los eventos tenían que ser agregados a Bindall. – reach4thelasers
¿Qué representa el tercer parámetro en la función de vinculación? – reach4thelasers
esto funcionó! ¡Gracias! Creo que he averiguado para qué sirve Bindall al leer otra publicación de stackoverflow, pero ¿por qué no funcionó? parece hacer lo mismo ... también ¿por qué no necesito un "esto" extra en la declaración de vinculación de la colección? – reach4thelasers