Sto girando in tondo, apparentemente mi manca qualcosa nella mia app attuale implementando backbone.js. Il problema è che ho un appView master, che inizializza varie sottoview (un grafico, una tabella di informazioni, ecc.) Per la pagina. Il mio desiderio è di essere in grado di cambiare il layout della pagina a seconda di un flag di parametro passato durante la navigazione.Backbone View Nesting
Ciò che si verifica è un caso in cui le sottoview, che hanno riferimento agli elementi dom che sarebbero stati posizionati dopo il rendering del modello, non hanno accesso a tali elementi durante il processo di inizializzazione di AppView principale. Quindi la domanda principale è come faccio a garantire che gli elementi dom corretti siano presenti per ogni processo di bind di eventi per ottenere l'installazione corretta?
Con il seguente codice, se un evento è associato a un cambio di modello all'interno di LayoutView, il layout viene visualizzato ma le viste successive non vengono visualizzate correttamente. Una cosa che ho manipolato è stata quella di impostare tutti i valori '.el' delle viste su un elemento statico all'interno della struttura html. Questo fa sì che il rendering si verifichi, anche se sembra che si stacchi dalla buona capacità dell'ambito fornita dall'utilizzo di '.el'.
codice di esempio:
//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: Per semplicità Ho appena risistemato div tra i due layout.
<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>
Apprezzo l'intuizione/input che qualcuno di voi può avere. Grazie!
Solo FYI, hai un sacco di errori di battitura nel tuo codice - è sicuro assumere questi sono problemi di copia/incolla, non veri errori di sintassi? – nrabinowitz
La copia/incolla della colpa, la logica sottostante, si spera ancora venga trasmessa. Grazie per la segnalazione. – aztechy