如何使用编译型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
相关产品推荐
相关产品推荐

