Actualmente estoy tratando de implementar un método de destrucción / eliminación para las vistas, pero no puedo obtener una solución genérica que funcione para todas mis vistas.
Esperaba que hubiera un evento para adjuntar al controlador, de modo que cuando llegue una nueva solicitud, destruya las vistas anteriores y luego cargue las nuevas.
¿Hay alguna forma de hacer esto sin tener que crear una función de eliminación para cada vista?
javascript
javascript-events
backbone.js
Ad Taylor
fuente
fuente
Respuestas:
Sin conocer toda la información ... podría vincular un disparador de reinicio a su modelo o controlador:
this.bind("reset", this.updateView);
y cuando desee restablecer las vistas, active un restablecimiento.
Para su devolución de llamada, haga algo como:
updateView: function() { view.remove(); view.render(); };
fuente
this.remove()
llamadasthis.stopListening()
ythis.$el.remove()
. El primero elimina todos los detectores de eventos agregados mediantethis.listenTo(...)
. El segundo elimina todos los oyentes de eventos que se agregan usando jQuery. Entre los dos, debería estar cubierto a menos que haya utilizado algún otro medio para agregar detectores de eventos. Entonces esta respuesta es correcta y obtiene +1 de mí.Tenía que estar absolutamente seguro de que la vista no solo se eliminó del DOM sino que también se desvinculó por completo de los eventos.
destroy_view: function() { // COMPLETELY UNBIND THE VIEW this.undelegateEvents(); this.$el.removeData().unbind(); // Remove view from DOM this.remove(); Backbone.View.prototype.remove.call(this); }
Me pareció una exageración, pero otros enfoques no funcionaron por completo.
fuente
this.$el
lugar de$(this.el)
;)this.remove()
?Sé que llego tarde a la fiesta, pero espero que esto sea útil para otra persona. Si está usando backbone v0.9.9 +, puede usar
listenTo
ystopListening
initialize: function () { this.listenTo(this.model, 'change', this.render); this.listenTo(this.model, 'destroy', this.remove); }
stopListening
es llamado automáticamente porremove
. Puedes leer más aquí y aquífuente
Esto es lo que he estado usando. No he visto ningún problema.
destroy: function(){ this.remove(); this.unbind(); }
fuente
Según la documentación actual de Backbone ...
view.remove ()
Elimina una vista y su el del DOM, y llama a stopListening para eliminar cualquier evento vinculado que la vista haya escuchado.
fuente
Creo que esto debería funcionar
destroyView : function () { this.$el.remove(); }
fuente
this.stopListening()
y luegoreturn this
por si acaso¡Podrías usar la forma de resolver el problema!
initialize:function(){ this.trigger('remove-compnents-cart'); var _this = this; Backbone.View.prototype.on('remove-compnents-cart',function(){ //Backbone.View.prototype.remove; Backbone.View.prototype.off(); _this.undelegateEvents(); }) }
Otra forma : Crea una variable global, como esta:
_global.routerList
initialize:function(){ this.routerName = 'home'; _global.routerList.push(this); } /*remove it in memory*/ for (var i=0;i<_global.routerList.length;i++){ Backbone.View.prototype.remove.call(_global.routerList[i]); }
fuente