2009-11-16 8 views
29

In Grails gibt es zwei Mechanismen für die Modularität in den Ansichtsschichten: Vorlage und TagLib.Grails: Vorlagen vs TagLibs.

Während ich meine eigene Grails-App schreibe, stehe ich oft vor der gleichen Frage, wenn ich eine UI-Komponente schreiben muss: brauche ich eine Vorlage oder eine TagLib?

Nach der Suche im Internet, ich habe nicht viel Best Practices oder Faustregeln im Zusammenhang mit dieser Design-Entscheidung, finden, so können Sie uns helfen und mir sagen:

  1. Was ist das wichtigste ist Unterschied zwischen den beiden Mechanismen?
  2. In welchen Szenarien verwenden Sie eine TagLib anstelle einer Vorlage (und umgekehrt)? , Nirgendwo sonst

Antwort

23

Es gibt definitiv einige Überschneidungen, aber unten sind einige Dinge zu beachten. Eine Möglichkeit, darüber nachzudenken, ist, dass Template wie eine Wiederverwendung auf Methodenebene ist, während TagLibs für die Wiederverwendung auf API-Ebene praktischer sind.

  • Vorlagen sind groß, wenn Sie etwas Bestimmtes für die Anzeige zu formatieren. Wenn Sie beispielsweise ein Domänenobjekt auf eine bestimmte Weise anzeigen möchten, ist es normalerweise einfacher, es in einer Vorlage zu tun, da Sie HTML im Grunde nur mit einigen schreiben. Es ist wiederverwendbar, aber ich denke, seine Wiederverwendbarkeit ist ein bisschen begrenzt. I.e. Wenn Sie eine Vorlage haben, verwenden Sie sie auf mehreren Seiten, nicht auf Hunderten von Seiten.

  • Auf der anderen Seite, Taglibs ist eine kleinere Einheit der Funktionalität, aber eine, die Sie eher an vielen Orten verwenden werden. Darin werden Sie wahrscheinlich Strings verketten. Wenn Sie also nach hundert Zeilen HTML suchen, sind sie weniger praktisch. Ein Schlüsselmerkmal, das taglibs erlaubt, ist die Fähigkeit, Dienste zu injizieren/interagieren. Wenn Sie beispielsweise einen Codeabschnitt benötigen, der einen Authentifizierungsdienst aufruft und den aktuellen Benutzer anzeigt, können Sie dies nur in einer TagLib tun. Sie müssen sich in diesem Fall keine Gedanken darüber machen, ob Sie etwas an die Taglib übergeben wollen - taglib wird es herausfinden und es aus dem Dienst herausfinden. Sie werden das wahrscheinlich auch auf vielen Seiten verwenden, daher ist es bequemer, eine Taglib zu haben, die keine Parameter benötigt.

  • Es gibt auch mehrere Arten von Taglibs, diejenigen, einschließlich, mit denen Sie über etwas in der Körper zu durchlaufen, haben bedingt, usw. - das ist nicht wirklich möglich, mit Vorlagen. Wie oben erwähnt, kann eine gut gestaltete Taglib-Bibliothek verwendet werden, um eine wiederverwendbare API zu erstellen, die Ihren Code GSP lesbarer macht. Innerhalb derselben * taglib.Groovy Sie können mehrere Tag-Definitionen haben, das ist ein weiterer Unterschied - Sie können sie alle an einem einzigen Ort gruppieren und von einer Taglib in eine andere aufrufen.

Auch bedenken Sie, dass Sie eine Vorlage aus dem Inneren eines taglib aufrufen können, oder Sie können Taglibs withing Vorlagen aufrufen, so dass Sie je nach Bedarf mischen und anpassen können.

Hoffen, dass dies für Sie ein wenig aufklärt, obwohl wirklich viel davon ist, was Konstrukt ist bequemer zu Code und wie oft es wiederverwendet wird.

+1

Großartig !! Genau die Art von Antworten, die ich erwartet hatte! Du hast Worte in Worte gefasst und kaum formalisiert, was ich nur aus Intuition fühlte. Vielen Dank. – fabien7474

+1

"über etwas im Körper iterieren, bedingt, usw. - das ist mit Vorlagen nicht wirklich möglich" - äh, tut mir leid? Sie können beliebigen Groovy-Code in eine Vorlage schreiben. Und Vorlage kann über Array iterieren und Bedingungen auch ohne Groovy-Code tun. Allerdings ist es besser, dies zumindest zu tun. –

+0

Victor - Ich meinte, dass innerhalb von taglib body Sie zusätzlichen Code ausführen können, der nichts mit Ihrer Taglib zu tun hat, nicht dass Sie Code in den Templates nicht ausführen können. Ich hätte mich wahrscheinlich mehr qualifizieren sollen. –

2

Was uns ...

ist Kodierer soll bestimmte Objektpräsentationslogik in Vorlage sehen.

Wir verwenden Taglibs nur für isolierte Seitenelemente, die überhaupt nicht mit Geschäftslogik in Verbindung stehen. Tatsächlich versuchen wir, ihre Verwendung zu minimieren: Es ist zu einfach, Geschäftslogik in eine Taglib zu schreiben.

Vorlagen sind der herkömmliche Weg zu gehen; zum Beispiel unterstützen sie Layouts (übrigens, sie können ein dritter Mechanismus genannt werden)

+0

Guter Punkt über die Gefahr, Geschäftslogik in eine Taglib zu schreiben. In dieser Hinsicht ähnelt es einem Controller. Im Zweifelsfall in einen Service stecken und dann den Service anrufen! (entweder von einer Taglib _oder_ einem Controller _oder_ beiden!) – cdeszaq