Ich habe neulich in das gleiche Problem laufen und entschied mich für ein Muster der Marionette Event-System, um die Ansichten ihren Status vor dem Auslösen von show() mitzuteilen. Ich benutze auch requireJS, was zusätzliche Komplexität hinzufügt - aber dieses Muster hilft!
Ich habe eine Ansicht mit einem UI-Element, das beim Klicken ein Ereignis auslöst, um eine neue Ansicht zu laden. Dies könnte eine Unteransicht oder eine Navview sein - egal.
App.execute('loadmodule:start', { module: 'home', transition: 'left', someOption: 'foo' });
Dieses Ereignis wird von dem ‚setHandlers‘ Wreqr gefangen und löst eine Sequenz Ansicht Laden (in meinem Fall eine Reihe von Logikzustandsübergängen zu handhaben ich tue). Die Sequenz 'Start' fügt die neue Ansicht ein und übergibt die erforderlichen Optionen.
var self = this;
App.commands.setHandlers({'loadmodule:start': function(options) { self.start(options);
Dann behandelt die Ansicht, die geladen wird, die Sammlungen/Modelle und ruft beim Initialisieren ab. Die Ansicht wartet auf Modell-/Auflistungsänderungen und löst dann ein neues "ready" -Ereignis mit dem Befehl wreqr executhre aus.
this.listenTo(this.model, 'change', function(){
App.execute('loadmodule:ready', { view: this, options: this.options });
});
ich einen anderen Handler haben, dass bereit Ereignis fängt (und Optionen, einschließlich der Ansicht opject Referenz) und die Show auslöst().
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;
Ich werde versuchen, einen anständigen Kern des gesamten Systems zu schreiben und hier in der nächsten Woche veröffentlichen oder so.
Wäre es nicht einfacher, stattdessen die 'app.content.show()' bis nach dem Fetch zu verzögern? Das würde die Wiedergabe der Ansicht verzögern, bis das Modell abgerufen wird. –
Wenn Sie stattdessen eine Art von Lade-Nachricht anzeigen möchten, sehen Sie sich https://github.com/marionettejs/backbone.marionette/wiki/Displaying-A-%22loading-...%22-Message-For- A-Collection-oder-Composite-View –