2013-08-13 7 views
6

qualcosa di dato in questo modo:Nella marionetta della dorsale c'è un modo per dire se una vista è già mostrata in una regione?

View = Backbone.Marionette.ItemView.extend({ }); 

myView = new View(); 

//region already exists 
myLayout.region.show(myView) 

//some time later this gets called again: 
myLayout.region.show(myView) 

posso vedere CurrentView nella documentazione ma questo sembra solo di applicare a inizializzazione. Una volta visualizzata una vista, posso interrogare la regione per vedere la vista? Potrebbe essere utile l'istanza o il tipo di visualizzazione. Guardando il debugger di Chrome non riesco a vedere nessuna proprietà/metodo sulla regione che possa essere d'aiuto.

Il motivo per voler fare questo è così non mi presento una vista voce statica in una regione ancora una volta, se si è già visualizzato come questo può (soprattutto se le immagini sono coinvolti) causare un leggero effetto sfarfallio sullo schermo.

Grazie

--Justin Wyllie

risposta

11

è possibile aggiungere una condizione prima di chiamare metodo Show:

if (myLayout.region.currentView != myView) 
    myLayout.region.show(myView) 

quindi se si tenta di chiamare show con la stessa View che non sarà mostrato.

se si desidera chiamare region.show(myView) una volta è possibile controllare in questo modo:

if (_.isUndefined(myLayout.region.currentView)) 
    myLayout.region.show(myView) 
+0

Grazie. Questo è quello che speravo di fare. Ma sulla regione le uniche proprietà che vedo sono el e opzioni. Nessun segno di una proprietà currentView che posso controllare. –

+0

Quale versione di Marionette.js sta usando? Il codice che ho postato nella mia risposta che sto usando nel mio progetto. – evilive

+0

Sembra 1.0.3. In alternativa è currentView qualcosa che stai impostando? Forse? –

7

è possibile controllare i isClosed e $el attributi della vista. Qualcosa di simile

if (myView.isClosed || _.isUndefined(myView.$el)) { 
    myLayout.region.show(myView); 
} 

Questo è lo stesso modo in cui i controlli regione per vedere se la vista è chiusa o no:

show: function(view) { 

    this.ensureEl(); 

    var isViewClosed = view.isClosed || _.isUndefined(view.$el); 
    ... 
+0

Grazie. Questo risponde alla mia domanda. –

+4

Se questo ha risposto alla tua domanda, contrassegnala come accettata. –

0

vado su un arto qui e supponendo che la domanda del PO è in base al comportamento dell'app quando si naviga in diverse parti dell'app tramite un tag di ancoraggio nella navigazione o qualcosa di simile.

Ecco come ho trovato la domanda e ho pensato brevemente che le risposte avrebbero salvato la mia giornata. Sebbene entrambe le risposte siano corrette, non risolvono il problema che stavo affrontando. Volevo visualizzare una barra di navigazione persistente. Tuttavia, non volevo che fosse visualizzato nella pagina di accesso. Speravo che scoprendo se una Regione fosse già stata mostrata o meno sarei in grado di lasciare che la logica del display si occupi di questo.

Come si è visto eravamo entrambi sulla strada giusta per realizzare regioni come questo fornisce un controllo granulare, ma anche dopo l'attuazione della sopra ho scoperto che la mia barra di navigazione sarebbe ancora "sfarfallio" ed essenzialmente ricaricare completamente in sé.

La risposta è in realtà un po 'ridicola. In qualche modo, in tutte le esercitazioni e ricerche Backbone che ho fatto nelle ultime due settimane, non mi sono mai imbattuto nella necessità di implementare un'interfaccia javascript per interrompere il normale comportamento dei collegamenti. Ogni volta che si fa clic su un elemento di navigazione, l'intera app si sta ricaricando. Il routing funzionava in modo che il contenuto fosse corretto, ma il tremolio era esasperante.

Ho aggiunto quanto segue al mio file app.js subito dopo il Backbone.history.start ({pushState: true}); codice:

// Holy crap this is SOOO important! 
$(document).on("click", "a[href^='/']", function(event) { 
    if (!event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { 
    event.preventDefault(); 
    var url = $(event.currentTarget).attr("href").replace(/^\//, ""); 
    Backbone.history.navigate(url, { trigger: true }); 
    } 
}); 

Dai un'occhiata a questo articolo per alcune spiegazioni sulla chiave di rilevamento.http://dev.tenfarms.com/posts/proper-link-handling

Boom! Dopo aver aggiunto questa roba nella mia app non si ricarica più completamente!

Diniego: Sono molto nuovo per Backbone e il fatto che quanto sopra è stata una tale rivelazione per me mi fa pensare che io possa fare qualcosa di sbagliato altrove e questo comportamento dovrebbe già esistere nel Backbone. Se ho fatto un errore gigante qui, per favore commenta e aiutami a correggerlo.

+0

Il collegamento che punta all'articolo è offline. – darksoulsong