1

我使用编译的抢劫。我的接头只做运行时工作(没有加载时工作)。我有一个template.tpl这样的:

<html>
<head>
    <title><titleSplice/></title>
</head>
<body>
    <bodySplice/>
</body>
</html>

这就是我做事的方式:

  • /:param路线的 Snap 动作中,我renderTemplate heistState "template"用来获取MyHeistRuntimeMonad Builder.
  • 我可以:param通过 ReaderT: 将值放入我的运行时 monad 来将值传递给我的拼接type MyHeistRuntimeMonad = ReaderT String IO。(其中String是传入的:param值。)

这就是我的问题。将数据从我的路由传递到我的接头的唯一方法是通过 heist runtime monad。这让事情变得有点复杂。我的问题:

  1. 有没有其他方法可以renderTemplate让我直接将数据传递给模板?例如,像这样的东西:renderTemplate' "template" [("titleSplice", "myTitle"), ("bodySplice", "myBody")].
  2. 如果这是不可能的,为什么不呢?我只是想知道为什么事情是这样设计的。我不太明白。
4

1 回答 1

1

您关注的运行时数据示例[("titleSplice", "myTitle"), ("bodySplice", "myBody")]远没有 Heist 公开的模型强大。您的模型是简单的标签名称替换。Heist 的拼接模型是Node -> m [Node]. 这使得它可以做一些非常强大的事情,比如缓存标签markdown 标签,甚至头部与 html 标签的合并

Heist 使用的 monad 转换器方法是一种简单而明显的实现,它使所有运行时数据都可以访问拼接。它还将拼接视为后端提供的通用 API,前端设计人员可以在任何地方使用。其他配方是否可行?我确定有。但这一个简单而强大。

您的配方也非常特定于模板。如果设计人员想要向页面添加某种新类型的数据,则必须更改 Haskell 代码以适应这种情况。使用 Heist 的方法,不需要更改 Haskell 代码。这给了设计师很大的权力以一种非常解耦的方式改变事物。

于 2016-08-29T17:32:52.380 回答