2009-11-16 6 views
29

Dans Grails, il existe deux mécanismes de modularité dans les couches de vue: Modèle et TagLib. Pendant que j'écris ma propre application de Grails, je suis souvent confronté à la même question quand j'ai besoin d'écrire un composant d'interface utilisateur: dois-je utiliser un modèle ou un TagLib?Grails: Templates vs TagLibs.

Après une recherche sur le web, je ne l'ai pas trouvé beaucoup de les meilleures pratiques ou règles générales concernant cette décision de conception, donc pouvez-vous me aider et me dire:

  1. Quelle est la principale différence entre les deux mécanismes?
  2. Dans quels scénarios, utilisez-vous un TagLib au lieu d'un Template (et vice-versa)?

Répondre

23

Il y a certainement un certain chevauchement, mais ci-dessous sont plusieurs choses à penser. Une façon d'y penser est que Template est comme une réutilisation au niveau de la méthode, tandis que TagLibs est plus pratique pour la réutilisation au niveau de l'API.

  • Modèles sont parfaits pour quand vous devez formater quelque chose de spécifique pour l'affichage. Par exemple, si vous souhaitez afficher un objet de domaine d'une manière spécifique, il est généralement plus facile de le faire dans un modèle, car vous écrivez simplement du HTML avec certains. C'est réutilisable, mais je pense que sa réutilisabilité est un peu limitée. C'est à dire. Si vous avez un modèle, vous l'utiliserez sur plusieurs pages, pas sur des centaines de pages. Par contre, taglibs est une plus petite unité de fonctionnalité, mais que vous êtes plus susceptible d'utiliser dans de nombreux endroits. Dans celui-ci vous êtes susceptible de concaténer des chaînes, donc si vous cherchez à créer une centaine de lignes de HTML, elles sont moins pratiques. Une caractéristique clé de taglibs est la capacité à injecter/interagir avec les services. Par exemple, si vous avez besoin d'un morceau de code qui appelle un service d'authentification et affiche l'utilisateur actuel, vous ne pouvez le faire que dans une TagLib. Vous n'avez pas à vous soucier de transmettre quoi que ce soit au taglib dans ce cas - taglib ira le chercher. Vous êtes également susceptible d'utiliser cela dans de nombreuses pages, il est donc plus pratique d'avoir un taglib qui n'a pas besoin de paramètres.

  • Il y a aussi plusieurs types de taglibs, y compris ceux qui permettent à vous d'itérer sur quelque chose dans le corps , ont conditionnelle, etc - c'est pas vraiment possible avec les modèles. Comme je l'ai dit plus haut, une bibliothèque taglib bien conçue peut être utilisée pour créer une API réutilisable qui rendra votre code GSP plus lisible. Dans le même * taglib.groovy vous pouvez avoir plusieurs définitions de tag, donc c'est une autre différence - vous pouvez les regrouper tous en une seule fois, et appeler d'un taglib à un autre.

De plus, gardez à l'esprit que vous pouvez appeler un modèle à l'intérieur d'un taglib, ou vous pouvez appeler taglibs withing modèles, de sorte que vous pouvez mélanger et assortir au besoin.

Espérons que cela vous l'efface un peu, bien que ce soit vraiment ce que la construction est plus pratique à coder et à quelle fréquence elle sera réutilisée.

+1

Super !! Exactement le genre de réponses que j'attendais! Vous avez mis en mots et à peine formalisé ce que je ne ressentais que par intuition. Je vous remercie. – fabien7474

+1

"itérer sur quelque chose dans le corps, avoir conditionnel, etc - ce n'est pas vraiment possible avec des gabarits" - euh, désolé? Vous pouvez écrire du code Groovy arbitraire dans un modèle. Et le template peut itérer sur array et faire des conditionals même sans code Groovy. Cependant, il est préférable de le faire au minimum. –

+0

Victor - Je voulais dire qu'à l'intérieur du corps taglib vous pouvez exécuter du code supplémentaire, qui n'a rien à voir avec votre taglib, pas que vous ne pouvez pas exécuter du code dans les modèles. Je devrais probablement avoir qualifié plus. –

2

Pour nous ...

Un codeur est censé voir la logique spécifique de présentation d'objets dans le modèle, nulle part ailleurs.

Nous utilisons des taglibs uniquement pour les éléments de page isolés, sans rapport avec la logique métier. En fait, nous essayons de minimiser leur utilisation: il est trop facile d'écrire une logique métier dans un taglib.

Les modèles sont la méthode conventionnelle à suivre; par exemple, ils supportent les Layouts (btw, ils peuvent être nommés un troisième mécanisme)

+0

Bon point sur le danger d'écrire la logique métier dans un taglib. C'est similaire à un contrôleur à cet égard. En cas de doute, mettez-le en service, puis appelez le service! (soit d'un taglib _ou_ d'un contrôleur _ou_ les deux!) – cdeszaq