Estoy dando vueltas en círculos y aparentemente me falta algo en mi aplicación actual que implementa backbone.js. El problema es que tengo un AppView maestro, que inicializa varias subvistas (un gráfico, una tabla de información, etc.) para la página. Mi deseo es poder cambiar el diseño de la página dependiendo de un indicador de parámetro que se transmita mientras se navega.Jerarquización de la vista de red troncal
Lo que encuentro es un caso en el que las subvistas, que hacen referencia a elementos dom que estarían en su lugar después de la plantilla, no tienen acceso a esos elementos durante el proceso principal de inicialización de AppView. Entonces, la pregunta principal es, ¿cómo me aseguro de que los elementos Dom apropiados estén en su lugar para que cada proceso de enlace de evento se configure correctamente?
Con el siguiente código si tengo un evento vinculado a un cambio de modelo en mi LayoutView, el diseño se procesa pero las vistas siguientes no se representan correctamente. Algo con lo que he tropezado ha sido establecer todos los valores '.el' de las vistas en un elemento estático dentro de la estructura html. Esto hace que el renderizado ocurra, aunque parece que se aleja de la buena capacidad de alcance proporcionada al utilizar '.el'.
Código de ejemplo:
//Wrapped in jquery.ready() function...
//View Code
GraphView = Backbone.View.extend({ // init, model bind, template, supporting functions});
TableView = Backbone.View.extend({ // init, model bind, template, supporting functions});
LayoutView = Backbone.view.extend({
initialize: function() {
this.model.bind('change:version', this.render, this);
},
templateA = _.template($('#main-template').html()),
templateB = _.template($('#secondary-template').html()),
render: function() {
if ('main' == this.model.get('version')) {
this.el.html(this.templateA());
} else {
this.el.html(this.templateB());
}
},
});
MainView = Backbone.View.extend({
initialize: function() {
this.layoutView = new LayoutView({
el: $('#layoutContainer'),
model: layout,
});
this.graphView = new GraphView({
el: $('.graphContainer'),
model: graph
});
this.tableView = new TableView({
el: $('#dataTableContainer',
model: dataSet
});
},
});
// Model Code
Layout = Backbone.Model.extend({
defaults: {
version: 'main',
},
});
Graph = Backbone.Model.extend({});
dataSet = Backbone.Model.extend({});
// Router code...
// Fire off the app
AppView = new MainView($('#appContainer'));
// Create route, start up backbone history
HTML: Por simplicidad solo reordena los divs entre los dos diseños.
<html>
<head>
<!-- include above js and backbone dependancies -->
</head>
<body>
<script type="text/template" id="main-template">
<div class="graphContainer"></div>
<div class="dataTableContainer"></div>
<div>Some other stuff to identify that it's the main template</div>
</script>
<script type="text/template" id="secondary-template">
<div class="dataTableContainer"></div>
<div>Rock on layout version two!</div>
<div class="graphContainer"></div>
</script>
<div id="appContainer">
<div id="nav">
<a href="#layout/main">See Layout One</a>
<a href="#layout/secondary">See Layout Two</a>
</div>
<div id="layoutContainer"></div>
</div>
</body>
</html>
Apreciar la información/aportes que cualquiera de ustedes pueda tener. ¡Gracias!
Solo para tu información, tienes un montón de errores ortográficos en tu código. ¿Es seguro asumir que estos son problemas de copiar/pegar, no errores de sintaxis reales? – nrabinowitz
Blame copy/paste, la lógica subyacente, con suerte todavía se transmite. Gracias por señalar eso. – aztechy