簡體   English   中英

Snap:編譯的拼接代碼示例

[英]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>

personnameagelocation是要拼接的標簽。

我們定義了一個包含信息的簡單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 這里的idText -> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM