Creo que no entiendo muy bien la idea detrás del uso correcto de los enrutadores troncales. Esto es lo que tengo:Enrutadores centrales: aguarde a que se obtengan los datos primero
Tengo algunos datos que obtengo del servidor cuando se carga la página y luego los comparto en modelos y colecciones. El número de esos modelos y colecciones es indefinido. Quiero usar el enrutador para poder representar la vista de determinada colección directamente desde el principio.
El problema es: el enrutador de Backbone se inicia temprano, y como le pido que acceda a una determinada vista y active su acción render
, no puede hacer eso, porque esas vistas aún no se han creado. Eso significa que en realidad tengo que hacer que mis rutas comiencen después de que se complete la búsqueda.
No sé si esto es una forma correcta de hacerlo, pero la única idea que se me ocurrió es que:
- Wrap la definición de rutas y el bit
Backbone.history.start();
en un nivel superior separada -accesible (es decir, prepárese para llamarlo manualmente más tarde). - Run que funcionan como la devolución de llamada
success
para la de mis coleccionesfetch()
- El número de esas colecciones se desconoce, también tengo ninguna manera de saber cuándo todos ellos han sido extraídas, y yo no quiero iniciar el rutas más de una vez. Así que hago uso de
_.defer()
y_.once()
.
Esto funciona, pero seguro que se ve muy raro:
Routers:
window.startRoutes = _.once(function() {
var AccountPage = Backbone.Router.extend({
routes: {
'set/:id': 'renderSet',
},
renderSet: function(setId) {
/** … **/
// Call the rendering method on the respective CardView
CardsViews[setId].render();
}
});
var AccountPageRouter = new AccountPage;
Backbone.history.start();
});
Colección:
window.CardsCollection = Backbone.Collection.extend({
model: Card,
initialize: function(params) {
/** … **/
// Get the initial data
this.fetch({success: function() {
_.defer(startRoutes);
}});
},
});
Así que mi pregunta es ... estoy haciendo lo correcto? ¿O hay una mejor manera de hacer esto (debe ser)?
¿Por qué hacer una llamada ajax inmediatamente? ¿Por qué no simplemente renderizar la página con el json requerido para la carga de datos inicial y pasar los datos al inicio de la red troncal? – redsquare