2009-11-16 16 views
29

In Grails esistono due meccanismi per la modularità nei livelli di vista: Modello e TagLib.Grails: Modelli vs TagLibs.

Mentre sto scrivendo la mia app Grails, mi trovo spesso ad affrontare la stessa domanda quando devo scrivere un componente dell'interfaccia utente: devo utilizzare un modello o un tagLib?

Dopo la ricerca sul web, non ho trovato un sacco di migliori pratiche o regole empiriche riguardo a questa decisione di progettazione, in modo da mi potete aiutare e dimmi:

  1. Qual è il principale differenza tra i due meccanismi?
  2. In quali scenari, si utilizza un TagLib anziché un modello (e viceversa)?

risposta

23

C'è sicuramente qualche sovrapposizione, ma di seguito ci sono diverse cose a cui pensare. Un modo per pensarci è che Template è come un riutilizzo a livello di metodo, mentre TagLib è più conveniente per il riutilizzo a livello di API.

  • Modelli sono l'ideale per quando si deve formattare qualcosa di specifico per la visualizzazione. Ad esempio, se desideri visualizzare un oggetto dominio in un modo specifico, in genere è più semplice farlo in un modello, poiché in pratica stai semplicemente scrivendo HTML con alcuni. È riutilizzabile, ma penso che la sua riusabilità sia un po 'limitata. Cioè se hai un modello, lo utilizzerai in diverse pagine, non in centinaia di pagine.

  • D'altra parte, i tagli sono un'unità più piccola di funzionalità, ma è più probabile che si utilizzi in molti posti. In esso è probabile che si concatenano stringhe, quindi se stai cercando di creare un centinaio di righe di HTML, sono meno convenienti. Una caratteristica fondamentale dei tagli è la capacità di iniettare/interagire con i servizi. Ad esempio, se è necessario un pezzo di codice che richiama un servizio di autenticazione e visualizzi l'utente corrente, è possibile farlo solo in un tagLib. Non devi preoccuparti di passare nulla al taglib in questo caso - taglib andrà a capirlo dal servizio. È probabile che tu lo usi in molte pagine, quindi è più comodo avere un taglib che non ha bisogno di parametri.

  • ci sono anche diversi tipi di taglibs, compresi quelli che consentono di iterazioni su qualcosa nel corpo , hanno condizionato, ecc - che non è davvero possibile con i modelli. Come ho detto sopra, una libreria tagliente ben progettata può essere utilizzata per creare un'API riutilizzabile che rende il codice GSP più leggibile. Dentro lo stesso * taglib.groovy puoi avere più definizioni di tag, quindi questa è un'altra differenza: puoi raggrupparle tutte in una volta e chiamare da un taglib a un altro.

Inoltre, tenete a mente che è possibile richiamare un modello all'interno di un taglib, oppure è possibile chiamare taglibs withing modelli, in modo da poter combinare in base alle esigenze.

Spero che questo chiarisca un po 'per voi, anche se in realtà molto di questo è ciò che il costrutto è più conveniente da codificare e quanto spesso verrà riutilizzato.

+1

Grande !! Esattamente il tipo di risposte che mi aspettavo! Hai messo in parole e hai appena formalizzato ciò che provavo solo per intuizione. Grazie. – fabien7474

+1

"iterare su qualcosa nel corpo, avere un condizionale, ecc. - non è davvero possibile con i modelli" - ehm, scusa? È possibile scrivere codice Groovy arbitrario nel modello. E il modello può scorrere su array e fare condizionali anche senza codice Groovy. Tuttavia, è meglio farlo al minimo. –

+0

Victor: intendevo che all'interno di taglib body è possibile eseguire codice aggiuntivo, che non ha nulla a che fare con il taglib, non che non è possibile eseguire il codice nei modelli. Probabilmente avrei dovuto qualificarmi di più. –

2

Quanto a noi ...

si suppone un codificatore per vedere logica specifica oggetto di presentazione in template, non altrove.

Utilizziamo i tagli solo per elementi di pagina isolati, non correlati alla logica di business. In realtà, cerchiamo di minimizzarne l'utilizzo: è troppo facile scrivere la logica di business in un taglib.

I modelli sono la soluzione convenzionale; per esempio, supportano i layout (btw, possono essere nominati un terzo meccanismo)

+0

Buon punto sul pericolo di scrivere la logica di business in un taglib. È simile a un controller in questo senso. In caso di dubbi, mettilo in un servizio, quindi chiama il servizio! (da un taglietto _o un controller _o entrambi!) – cdeszaq

Problemi correlati