[英]Snap: compiled splices code example
我想我前段時間確實問了一個類似的問題,但由於API不穩定而沒有回答。 所以我在等待0.13經過。 我不確定提出類似問題是否正確......?
在編譯的拼接世界中解釋runChildrenWith(Text)
和mapSplices
的替代方法是什么? (這種組合似乎是最常見的)如果可能,我真的很感謝一些代碼示例。
如果我理解正確,我們將所有應用程序拼接匯集在一起,然后將它們添加到heistInit
。 有人能說明怎么做嗎?
splice綁定標記在整個應用程序中必須是唯一的嗎?
是否有一個完整的快照項目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”函數,根據文檔,它在解釋的lib中產生與mapSplices類似的結果。 我們可以用它代替“C.manyWithSplices C.runChildren”組合嗎?
假設您要顯示有關使用編譯拼接的人員列表的信息(假設我們從snap init
生成的腳手架開始。)
一個非常簡單的帶有虛擬值的_persons.tpl
模板就像是
<body>
<person>
<div>
<h1><name>dummy name</name></h1>
<p><age>77</age></p>
<p><location>jauja</location></p>
</div>
</person>
</body>
person
, name
, age
和location
是要拼接的標簽。
我們定義了一個包含信息的簡單Snaplet
data Foo = Foo
{
_persons :: [Person]
}
makeLenses ''Foo
data Person = Person
{
_name :: Text
, _age :: Int
, _location :: Text
}
makeLenses ''Person
然后我們將其添加到App
記錄中:
data App = App
{ _heist :: Snaplet (Heist App)
, _sess :: Snaplet SessionManager
, _auth :: Snaplet (AuthManager App)
, _foo :: Snaplet Foo
}
我們將以下內容添加到應用初始值設定項中
f <- nestSnaplet "foo" foo $ makeSnaplet "foo" "Foo Snaplet" Nothing $ return $ Foo $
[ Person "Ricardo" 33 "Los Cantones"
, Person "Luis" 38 "Montealto"
]
...
return $ App h s a f
此函數構造一個返回人員列表的Handler(使用Control.Lens
view
):
personH :: SnapletLens b Foo -> Handler b b [Person]
personH l = withTop l $ view persons <$> get
此函數從RuntimeSplice
構造適當的編譯剪接,生成人員列表。 RuntimeSplice
表示只能在運行時知道的信息,而不是加載時間:
personSplice :: Monad n => RuntimeSplice n [Person] -> C.Splice n
personSplice = C.manyWithSplices C.runChildren splicefuncs
where
splicefuncs = mconcat
[ "name" ## (C.pureSplice . C.textSplice $ view name)
, "age" ## (C.pureSplice . C.textSplice $ T.pack . show . view age)
, "location" ## (C.pureSplice . C.textSplice $ view location)
]
此功能可用於在全局Heist配置中注冊拼接。 請注意,我們將Handler
提升為RuntimeSplice
:
addPersonSplices :: HasHeist b => Snaplet (Heist b) ->
SnapletLens b Foo ->
Initializer b v ()
addPersonSplices h l = addConfig h $ mempty
{
hcCompiledSplices = "person" ## (personSplice . lift $ personH l)
}
請務必將此行添加到應用初始值設定項:
addPersonSplices h foo
並將以下對添加到應用程序的路線:
("/persons", cRender "_persons")
如果您現在運行服務器,導航到http://127.0.0.1:8000/persons
應顯示該列表。
UPDATE
對於更簡單的情況(沒有復雜記錄,沒有鏡頭),您只需要顯示字符串列表。
模板可能是這樣的:
<body>
<strings>
<p><string>dummy value</string></p>
</strings>
</body>
頂級拼接將是:
stringSplice :: Monad n => C.Splice n
stringSplice = C.manyWithSplices C.runChildren splicefuncs (return ["aa","bb","cc"])
where
splicefuncs = "string" ## (C.pureSplice . C.textSplice $ id)
這意味着“當我們遇到與此拼接關聯的標記時,執行生成字符串列表的操作,並為每個字符串渲染標記的內容,用當前字符串替換string
標記”。
請注意, manyWithSplices的簽名強制(##)
右側的東西具有類型RuntimeSplice n Text -> Splice n
。 這里的id
有Text -> Text
類型。 C.TextSplice
將其轉換為Text -> Builder
類型,而C.pureSplice
將最終轉換為RuntimeSplice n Text -> Splice n
。
代替(return ["aa","bb","cc"])
你可以提供一個更復雜的動作,連接數據庫並從中提取字符串。
注冊此拼接的功能是:
addStringSplices :: HasHeist b => Snaplet (Heist b) -> Initializer b v ()
addStringSplices h = addConfig h $ mempty
{
hcCompiledSplices = "strings" ## stringSplice
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.