Tengo un PageView de nivel superior que se volverá a representar cada vez que cambie la ruta. Tengo muchas sub-vistas anidadas incrustadas en este PageView. Si tuviera que volver a procesar PageView, ¿debo quitar/desvincular todas las subvistas anidadas junto con PageView o solo tengo que quitar/desvincular el PageView? Si necesito eliminar/desvincular todas las sub-vistas, ¿cuál es la mejor manera de hacerlo?Backbone.js - Eliminar todas las vistas secundarias
Respuesta
Sí, tiene que quitar correctamente y desenlazar ellos:
La manera más fácil de hacer esto es para almacenar una gran variedad de sus sub-puntos de vista en la vista padre. Luego, en un método close
en la vista padre, recorrer la matriz y llamar a un método close
en las vistas secundarias:
ParentView = Backbone.View.extend({
initialize: function(){
this.childViews = [];
},
render: {
for (var i = 0; i < 10; i++){
var childView = new ChildView();
// do stuff with the child view
this.childViews.push(childView);
}
},
close: function(){
this.remove();
this.unbind();
// handle other unbinding needs, here
_.each(this.childViews, function(childView){
if (childView.close){
childView.close();
}
})
}
});
Asegúrese de llamar al método close
en la vista padre cuando esté listo para que sea eliminado/reemplazado. Esto asegurará que todos los niños se limpien correctamente (suponiendo que todos ellos tengan su propio método close
).
Hola, Derick, he seguido tu consejo sobre esto, pero estoy experimentando demoras realmente largas al cerrar una vista + es vistas de niños. En algunos casos, puede durar entre 5 y 10 segundos. Parece que el retraso viene de this.remove(). ¿Tienes alguna idea de por qué? – ragulka
¡es bastante largo y horrible! Nunca lo he visto, honestamente ... ¿Qué tan grande es la estructura DOM que estás eliminando? Mi única conjetura sería un navegador realmente lento, y/o un conjunto de nodos DOM muy grande. –
Oye, no importa, parece que es un problema con un complemento jquery que de alguna manera está en conflicto con la función remove() de la vista: http://stackoverflow.com/questions/9877786/calling-jquery-remove-on-custom-ui -widget-causes-infinite-loop/9878287 # 9878287 – ragulka
En lugar de mantener una vista de matriz de elementos secundarios, podría recorrer todas las propiedades de la vista y ver cuáles son una instancia de Backbone.View; Deberá asegurarse de establecer una propiedad para cada vista secundaria en su vista principal.
En el ejemplo siguiente, las vistas secundarias se establecen en las propiedades de la vista principal. No estoy seguro de cuál será el rendimiento al recorrer todas las propiedades, sin embargo, puede ser más fácil que hacer un seguimiento de una estructura de datos separada para las vistas secundarias.
Ejemplo:
var ContextView = Backbone.View.extend({
initialize: function() {
// views render themselves via their initialize methods
this.titlebar = new TitlebarView({el: $("#titlebar")});
this.toolbar = new ToolbarView({el: $("#toolbar")});
this.content = new ContentView({el: $("#content")});
},
removeChildViews: function() {
for(var prop in this){
if (this[prop] instanceof Backbone.View) {
console.log("This is a view: "+ prop + ' in ' + this[prop]);
}
}
},
render: function() {
this.$el.html(this.el);
}
});
una clase simple y modular que pueda ser útil.
ContainerView = Backbone.View.extend({
initialize: function() {
this.children = [];
},
remove: function() {
Backbone.View.prototype.remove.apply(this, arguments);
this.removeAllChildren();
},
removeAllChildren: function() {
_.each(this.children, function(view) { view.remove(); });
this.children = [];
},
appendAllChildren: function() {
_.each(this.children, function(view) { this.$el.append(view.render().$el); }, this);
}
});
uso:
MyView = ContainerView.extend({
render: function() {
this.removeAllChildren();
this.$el.empty();
// For each child view...
// this.children.push(new SomeControl(...));
this.appendAllChildren();
return this;
}
});
Un poco como Zengineer escribió, me gusta parchear Backbone.View.remove globalmente como la siguiente, de modo que los puntos de vista para niños fijado en este se eliminan
var originalRemove = Backbone.View.prototype.remove;
Backbone.View.prototype.remove = function()
{
for (var view in this){
if (this[view] instanceof Backbone.View && this[view] != this) {
this[view].remove();
}
}
originalRemove.apply(this, arguments);
}
- 1. Establecer GestureDetector en todas las vistas secundarias
- 2. cómo eliminar vistas secundarias
- 3. Quitar todas las vistas secundarias de la vista
- 4. Backbone.js: cómo realizar la recolección de elementos no utilizados en vistas principales y vistas secundarias
- 5. Eliminar todas las vistas desde SQL Server
- 6. Backbone.js: comunicación entre vistas
- 7. Diseño de ASP.NET MVC 3 Datos ViewBag en todas las vistas secundarias
- 8. ¿Vistas de limpieza con backbone.js?
- 9. Eliminar todas las imágenes
- 10. En un ListView de Android, ¿cómo puedo iterar/manipular todas las vistas secundarias, no solo las visibles?
- 11. Backbone.js - ¿Las vistas anidadas deben mantener referencias entre ellas?
- 12. jQTouch y Backbone.js Enrutamiento/Vistas
- 13. Linq a SQL C# Obtenga productos en todas las categorías secundarias/secundarias demasiado lentas
- 14. Cargar todas las vistas de TabBar
- 15. Gestión de las vistas con los routers en Backbone.js
- 16. ¿por qué bindAll en las vistas de backbone.js?
- 17. ¿Cómo desencadenar/vincular eventos personalizados en las vistas de Backbone.js?
- 18. Vistas de anidamiento dentro de Vistas en backbone.js
- 19. backbone.js - vistas dentro de vistas y administración de eventos
- 20. eliminar todas las variables, excepto las funciones
- 21. ¿Vistas dentro de las vistas? ¿Cómo generar listas de elementos con Backbone.js?
- 22. Eventos en vistas anidadas de Backbone.js
- 23. Agregar UIView sobre todas las demás vistas, incluyendo StatusBar
- 24. Android: Acceda a vistas secundarias desde un ListView
- 25. ¿Dónde guardo las vistas parciales (vistas) en Zend Framework, para poder acceder a todas las vistas en mi aplicación?
- 26. Eliminar todas las entidades en Entity Framework
- 27. ¿Cómo eliminar todas las columnas de JTable?
- 28. Eliminar todas las instancias de CKEditor
- 29. UIButton eliminar todas las acciones de destino
- 30. eliminar todas las subcapas de una visión
¿Qué quiere decir con desvinculación de subvistas? ¿Te refieres a eventos? – Trevor