在已编译的 Heist (Haskell) 中将数据直接传递到模板中?

Passing data directly into templates in compiled Heist (Haskell)?

我使用的是编译好的海斯特。我的拼接只做 运行 时间工作(没有加载时间工作)。我有一个 template.tpl 这样的:

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

这是我做事的方式:

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

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

您关注 [("titleSplice", "myTitle"), ("bodySplice", "myBody")] 的运行时数据的示例远不如 Heist 公开的模型强大。您的模型是简单的标签名称替换。 Heist的拼接模型是Node -> m [Node]。这允许它做非常强大的事情,比如 cache tag, the markdown tag, and even head merging with the html tag.

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

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