2012-01-16 10 views
7

Sto cercando di costruire un layout comune pagina con un contenuto div principale e una barra laterale con la Play framework:Rendering la barra laterale dalla Play quadro

<html> 
<head></head> 
<body> 
<div id="all"> 
    <div id="content">the ususal doLayout stuff</div> 
    <div id="sidebar"> 
    <div class="widget">Recent comments...</div> 
    <div class="widget">Recent posts...</div> 
    other Widgets... 
    </div> 
</div> 
</body> 
</html> 

E 'possibile rendere i widget nella barra laterale, senza vincolo preventivo del contenuto dei widget in ogni controller? Anche se non esiste un tale widget nel modello, dovrei ottenere tutti i dati richiesti.

Recentemente ho utilizzato il Lift Framework e ho potuto scrivere solo <div class="lift:someWidget.news">. Ciò chiama il metodo news nella classe someWidget per il rendering del widget. È possibile recuperare i dati dal database con quel metodo, quindi non è necessario il binding preventivo. C'è qualcosa di simile in Play per salvare query DB non necessarie e codice non correlato nel controller?

risposta

5

Sì. Ecco le mie due opzioni preferite. L'opzione giusta dipende dal tuo particolare caso d'uso.

Opzione 1 - Utilizzare la notazione @before

Usando l'annotazione @before, è possibile eseguire l'elaborazione comune su ogni azione che viene richiamato. Eseguirà il metodo prima che venga eseguita l'azione principale, consentendo di memorizzare i dati nella mappa renderArgs, che è disponibile all'interno della vista.

Questi dati nella vista possono quindi essere accessibili nel modello principale e quindi disponibili in tutte le visualizzazioni.

Opzione 2 - Usa AJAX

Mettere alcune div come segnaposto come avete fatto nel tuo esempio, e quindi utilizzare il carico JQuery che chiamerà un'azione sul tuo serverside per generare un piccolo pezzo di codice HTML solo per il frammento di cui hai bisogno.

2

È possibile chiamare un metodo di controller statico da un modello. Nota la @Util - annotazione per dire Play che questo non è inteso come azione - Metodo:

@Util 
public static List<Post> getPosts() { 
    ... 
} 

quindi chiamare questo dal modello (forse un tag personalizzato):

<div class="widget"> 
%{ 
    def posts=controllers.Post.getPosts() 

    for(post in posts) { 
    }% 
     <h2>${post.header}</h2> 
     <p>${post.body}</p> 
    %{ 
    } 
}% 
</div> 

Poiché si tratta di violando il puro pattern MVC non raccomanderei di usarlo pesantemente. Ma usato con saggezza può essere una soluzione davvero pragmatica. E il tuo caso d'uso per costruire una barra laterale in un layout generale è un uso perfettamente valido (secondo me) - se in seguito decidi di fornire una rappresentazione json dei tuoi dati nel contenuto principale non viene utilizzata la barra laterale del layout - e quindi i dati non viene recuperato quando si utilizza questo modello.

+0

Risposta molto utile, grazie! – Dave

Problemi correlati