You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用编译型Heist将编译后的Splice插入模板标签?

解决Heist模板中apply-content标签替换问题

核心思路

Heist的apply-content是模板继承的核心机制,不需要修改预编译Splice列表,正确做法是利用Heist的模板组合API,在渲染前完成模板嵌套组合,再结合预编译Splice渲染最终内容。

具体实现步骤

1. 保留现有预编译逻辑

保持main中预编译body-greeting等Splice的代码,确保这些Splice在模板渲染阶段可被调用。

2. 模板组合与渲染

调用C.renderTemplate前,先通过C.bindTemplate将body.tpl绑定到index.tpl的apply-content位置,再渲染组合后的模板:

-- 假设已初始化并预编译好HeistState
let heistState = ... -- 你的预编译后HeistState实例
-- 获取body模板
bodyTpl <- C.getTemplate "body.tpl" heistState
-- 将body模板绑定到index模板的apply-content标签
let combinedHeist = C.bindTemplate "apply-content" bodyTpl heistState
-- 渲染最终的index模板
result <- C.renderTemplate combinedHeist "index.tpl"

3. 结合Reader Monad传递视图数据

将数据库获取的路由数据通过Reader Monad注入Splice,确保渲染时Splice能访问到所需数据:

-- 定义应用环境,包含视图数据
data AppEnv = AppEnv { userData :: [User] }
-- 在预编译的Splice中使用Reader访问数据
greetingSplice :: Splice (Reader AppEnv)
greetingSplice = do
  users <- asks userData
  return [TextNode $ "Hello, " ++ show (length users) ++ " users!"]

关键注意点

  • apply-content是Heist内置的模板继承标签,bindTemplate是官方推荐的替换方式,无需修改预编译Splice列表,这是Heist的标准设计逻辑。
  • 预编译的Splice会自动作用于所有引用的模板,只要HeistState包含这些Splice,组合后的模板渲染时会自动执行对应Splice逻辑。

内容的提问来源于stack exchange,提问作者Vey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:06:15