Ho già riscontrato lo stesso problema e ho optato per un modello di utilizzo del sistema di eventi di Marionette per consentire alle viste di comunicare il loro stato prima di attivare show(). Sto anche usando requireJS che aggiunge una certa complessità aggiuntiva - ma questo modello aiuta!
Avrò una vista con un elemento dell'interfaccia utente che quando si fa clic, attiva un evento per caricare una nuova vista. Questa potrebbe essere una sottoview o una navview - non importa.
App.execute('loadmodule:start', { module: 'home', transition: 'left', someOption: 'foo' });
Questo evento viene catturato dal Wreqr 'setHandlers' e fa scattare una sequenza di visualizzazione di carico (nel mio caso sto facendo un po 'di logica per gestire le transizioni di stato). La sequenza "start" entra nella nuova vista e passa nelle opzioni necessarie.
var self = this;
App.commands.setHandlers({'loadmodule:start': function(options) { self.start(options);
Quindi la vista di caricamento gestisce le collezioni/modelli e recupera initalize. La vista ascolta le modifiche al modello/alla raccolta e quindi lancia un nuovo evento "pronto" usando il comando executre di wreqr.
this.listenTo(this.model, 'change', function(){
App.execute('loadmodule:ready', { view: this, options: this.options });
});
Ho un gestore diverso che cattura quell'evento pronto (e opzioni, tra cui la vista opject di riferimento) e fa scattare lo show().
ready: function(options) {
// catch a 'loadmodule:ready' event before proceeding with the render/transition - add loader here as well
var self = this;
var module = options.options.module;
var view = options.view;
var transition = options.options.transition;
var type = options.options.type;
if (type === 'replace') {
self.pushView(view, module, transition, true);
} else if (type === 'add') {
self.pushView(view, module, transition);
} else if (type === 'reveal') {
self.pushView(view, module, transition, true);
}
},
pushView: function(view, module, transition, clearStack) {
var currentView = _.last(this.subViews);
var nextView = App.main.currentView[module];
var self = this;
var windowheight = $(window).height()+'px';
var windowwidth = $(window).width()+'px';
var speed = 400;
switch(transition) {
case 'left':
nextView.show(view);
nextView.$el.css({width:windowwidth,left:windowwidth});
currentView.$el.css({position:'absolute',width:windowwidth,left:'0px'});
nextView.$el.animate({translate: '-'+windowwidth+',0px'}, speed, RF.Easing.quickO);
currentView.$el.animate({translate: '-'+windowwidth+',0px'}, speed, RF.Easing.quickO, function(){
if (clearStack) {
_.each(_.initial(self.subViews), function(view){
view.close();
});
self.subViews.length = 0;
self.subViews.push(nextView);
}
});
break;
cercherò di scrivere un succo decente di tutto il sistema e inserire qui la prossima settimana o giù di lì.
Non sarebbe più semplice ritardare invece il comando 'app.content.show() 'dopo il recupero? Ciò dovrebbe a tutti gli effetti ritardare il rendering della vista fino al recupero del modello. –
Se invece desideri mostrare qualche tipo di messaggio di caricamento, dai uno sguardo a https://github.com/marionettejs/backbone.marionette/wiki/Displaying-A-%22loading-...%22-Message-For- A-Collection-Or-Composite-View –