Grails:模板与 TagLibs。 [关闭]
Posted
技术标签:
【中文标题】Grails:模板与 TagLibs。 [关闭]【英文标题】:Grails: Templates vs TagLibs. [closed] 【发布时间】:2010-12-17 03:19:17 【问题描述】:在 Grails 中,视图层有两种模块化机制:Template 和 TagLib。
在编写自己的 Grails 应用程序时,当我需要编写 UI 组件时,我经常会遇到同样的问题:我需要使用模板还是 TagLib?
在网上搜索后,我没有找到很多关于这个设计决策的最佳实践或经验法则,所以你能帮我告诉我吗:
-
这两种机制的主要区别是什么?
在哪些情况下,您使用 TagLib 而不是模板(反之亦然)?
【问题讨论】:
【参考方案1】:肯定有一些重叠,但以下是需要考虑的几件事。一种思考方式是,Template 就像是方法级别的重用,而 TagLibs 更方便 API 级别的重用。
模板非常适合当您必须格式化特定内容以进行显示时。例如,如果您想以特定方式显示域对象,通常在模板中更容易,因为您基本上只是用一些 .它是可重用的,但我认为它的可重用性有点有限。 IE。如果你有一个模板,你会在几个页面中使用它,而不是在数百页中。
另一方面,taglibs 是一个较小的功能单元,但您更有可能在许多地方使用它。在其中您可能会连接字符串,因此如果您要创建一百行 html,它们就不那么方便了。 taglibs 允许的一个关键特性是注入/与服务交互的能力。例如,如果您需要一段代码来调用身份验证服务并显示当前用户,则只能在 TagLib 中执行此操作。在这种情况下,您不必担心将任何内容传递给 taglib - taglib 会从服务中找出它。您也可能在许多页面中使用它,因此拥有一个不需要参数的 taglib 会更方便。
还有几种 标签库,包括那些允许 你迭代的东西在 身体,有条件,等等 - 那是 模板真的不可能。 正如我上面所说,一个精心制作的 taglib 库可用于创建 一个可重用的 API,使您的 GSP 代码更具可读性。在同一个 *taglib.groovy 中,您可以有多个标签定义,所以这是另一个区别 - 您可以将它们全部分组到一个位置,然后从一个标签库调用到另一个标签库。
另外,请记住,您可以从标签库中调用模板,也可以使用模板调用标签库,因此您可以根据需要进行混合和匹配。
希望这可以为您澄清一点,尽管实际上其中很多是更方便编码的构造以及重复使用的频率。
【讨论】:
太棒了!!正是我所期待的那种答案!你已经用语言表达了我只是从直觉中感受到的东西。谢谢。 “迭代身体中的某些东西,有条件等等 - 这对于模板来说是不可能的” - 呃,对不起?您可以在模板中编写任意 Groovy 代码。即使没有 Groovy 代码,模板也可以遍历数组并执行条件。不过,最好至少这样做。 Victor - 我的意思是在 taglib 主体内你可以运行额外的代码,这与你的 taglib 无关,并不是说你不能在模板中运行代码。我可能应该有更多的资格。 我通常将两者混合使用。我将创建一个标签库来处理准备任何类型的模型,然后使用准备好的模型呈现模板。我尝试遵循的经验法则是大部分 HTML 应该在模板中,而大部分 Groovy 代码应该在 taglib 中。 当输出超过几行 HTML、JS 等时,模板确实提供了更好的可读性。尽管如此,当 TagLibs 比模板更可取时,例如在一个页面中使用多次时的广泛重用或性能原因,但是创建的 HTML 的结构在 TagLib 代码中丢失了 GSP 标签插件允许使用 GSP 定义标签。【参考方案2】:至于我们……
编码人员应该在模板中看到特定的对象表示逻辑,而不是其他任何地方。
我们仅将标签库用于孤立的页面元素,与业务逻辑完全无关。实际上,我们尽量减少它们的使用:在 taglib 中编写业务逻辑太容易了。
模板是传统的方式;例如,它们支持布局(顺便说一句,它们可以被命名为第三种机制)
【讨论】:
关于在 taglib 中编写业务逻辑的危险的要点。在这方面它类似于控制器。如有疑问,请将其放入服务中,然后调用服务! (来自标签库或控制器或两者!)以上是关于Grails:模板与 TagLibs。 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Grails 资源:图像是 404,即使它存在于 WAR 中
从 2.1 升级到 2.2.4 后 Grails 自动编译中断