30

在 Grails 中,视图层中有两种模块化机制:模板TagLib

在编写自己的 Grails 应用程序时,当我需要编写 UI 组件时,我经常会遇到同样的问题:我需要使用模板还是 TagLib?

在网上搜索后,我没有找到很多关于这个设计决策的最佳实践或经验法则,所以你能帮我告诉我:

  1. 这两种机制的主要区别是什么?
  2. 在哪些情况下,您使用 TagLib 而不是模板(反之亦然)?
4

2 回答 2

24

肯定有一些重叠,但以下是需要考虑的几件事。一种思考方式是,Template 就像是方法级别的重用,而 TagLibs 更方便 API 级别的重用。

  • 当您必须格式化特定的显示内容时,模板非常有用。例如,如果您想以特定方式显示域对象,通常在模板中更容易,因为您基本上只是用一些 . 它是可重用的,但我认为它的可重用性有点有限。即,如果您有一个模板,您会在几个页面中使用它,而不是在数百页中使用它。

  • 另一方面,标签库是一个较小的功能单元,但您更有可能在许多地方使用它。在其中您可能会连接字符串,因此如果您要创建一百行 HTML,它们就不那么方便了。taglibs 允许的一个关键特性是注入/与服务交互的能力。例如,如果您需要一段代码来调用身份验证服务并显示当前用户,则只能在 TagLib 中执行此操作。在这种情况下,您不必担心将任何内容传递给 taglib - taglib 会从服务中找出它。您也可能在许多页面中使用它,因此拥有一个不需要参数的 taglib 会更方便。

  • 还有几种标签库,包括那些允许您迭代身体中的某些东西、有条件等的标签库——这对于模板来说是不可能的。正如我上面所说,精心设计的 taglib 库可用于创建可重用的 API,使您的 GSP 代码更具可读性。在同一个 *taglib.groovy 中,您可以有多个标签定义,所以这是另一个区别 - 您可以将它们全部分组到一个位置,然后从一个 taglib 调用到另一个。

另外,请记住,您可以从 taglib 中调用模板,也可以使用模板调用 taglib,因此您可以根据需要进行混合和匹配。

希望这可以为您解决一点问题,尽管实际上其中很多是更方便编码的构造以及重用的频率。

于 2009-11-16T18:23:55.017 回答
3

至于我们...

编码人员应该在模板中看到特定的对象表示逻辑,而不是其他任何地方。

我们仅将标签库用于孤立的页面元素,与业务逻辑完全无关。实际上,我们尽量减少它们的使用:在 taglib 中编写业务逻辑太容易了。

模板是传统的方式;例如,它们支持布局(顺便说一句,它们可以被命名为第三种机制)

于 2009-11-16T17:41:58.597 回答