【发布时间】:2013-11-01 14:55:09
【问题描述】:
我想我前段时间确实问过类似的问题,但由于 API 不稳定而没有回答。所以我在等待 0.13 过去。我不确定提出类似问题是否正确...?
在编译拼接世界中解释 runChildrenWith(Text) 和 mapSplices 的替代方案是什么? (这个组合似乎是最常见的)
如果可能的话,我真的很感激一些代码示例。
如果我理解正确,我们将所有应用程序拼接在一起,然后将它们添加到heistInit。谁能告诉我怎么做?
拼接绑定标签在整个应用程序中是否必须是唯一的?
是否有完整的 snap 项目utilising 新的 API 和编译的拼接,以便我可以阅读和学习?
谢谢。
-- 更新--
下面的答案很好。但不幸的是,有些部分(带镜片的部分)让我更加困惑。 如果我理解正确,这是拼接字符串的简单方法:
mySplice = "testSplice" ## testSplice
where testSplice = return $ C.yieldRuntimeText $ do
return "text to be spliced"
如果我需要多次运行拼接字符串,比如在 5 个表中,我会这样做:
mySplices = C.manyWithSplices C.runChildren mySplice
这对吗?
我在尝试在抢劫配置中添加接头时遇到一堆错误。
addConfig h $ mempty
{
hcCompiledSplices = "mySplice" ## mySplice -- or mySplices
}
我哪里错了?抱歉有点慢。
我真正需要的(只是现在我能理解的)就是拼接并显示一个我从数据库接收到的简单字符串。
-- 更新 2 --
感谢 Daniel 的极有帮助的回答,我终于可以开始工作了。
到目前为止,我的两种代码都可以正常工作。
第一个,感谢丹尼尔
stringSplice :: Monad n => C.Splice n
stringSplice = C.manyWithSplices C.runChildren splicefuncs (return ["aa","bb","cc"])
where
splicefuncs = "string" ## (C.pureSplice . C.textSplice $ id)
第二个
testSplice :: C.Splice (Handler App App)
testSplice = return $ C.yieldRuntimeText $ return "text to be spliced"
在哪里
(C.pureSplice . C.textSplice $ id)
产生与
相似的结果return $ C.yieldRuntimeText $ return "text to be spliced"
以上有区别吗?任何情况下,人们会更喜欢另一种情况吗?它们似乎产生了相同的结果。
编译的拼接库中有一个“deferMany”函数,根据文档,它产生与解释库中的 mapSplices 相似的结果。 我们可以用它来代替“C.manyWithSplices C.runChildren”的组合吗??
【问题讨论】:
-
@r 编译的拼接起初并不直观,因为它们需要控制反转:您必须告诉拼接如何找到所需的运行时数据。我花了一段时间来掌握他们的窍门。我认为它们在最新版本的抢劫中变得更容易使用了。
-
@r 我认为
C.yieldRuntimeText和C.deferMany在您不关心要拼接的标签内容时就足够了:您只想用生成的字符串完全替换标签.withSplices和manyWithSplices可以在您想要渲染(一个,多个)具有字段的复杂结构时使用,并且您确实关心拼接标签的内容,因为它们定义了结构的“视图”。withSplices和manyWithSplices让您在顶级拼接和渲染各个字段的子拼接之间建立对应关系。 -
@r 这就是为什么
C.withSplices和C.manyWithSplices经常与C.runWithChildren结合使用。这基本上就像说“使用标签的内容作为我们要渲染的结构的视图”。 -
@Daniel 再次感谢。如果卡住了,我会尝试找出其余的并打开另一个问题。
标签: haskell haskell-snap-framework heist