Haskell 捕捉:带盗窃的内/外循环
我不确定我是否正确地表达了标题中的问题,但情况如下。。 当表字段(模式)仅在运行时可用时,我需要创建一个带有heist的动态表。 通常,当模式在编译时已知时,我会这样做:Haskell 捕捉:带盗窃的内/外循环,haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,我不确定我是否正确地表达了标题中的问题,但情况如下。。 当表字段(模式)仅在运行时可用时,我需要创建一个带有heist的动态表。 通常,当模式在编译时已知时,我会这样做: <table> <row-splice> <tr> <td> <field1/> </td> <td> <field2/> </td> <td> <fie
<table>
<row-splice>
<tr>
<td> <field1/> </td>
<td> <field2/> </td>
<td> <field3/> </td>
</tr>
</row-splice>
</table>
<table>
<row-splice>
<tr>
<field-splice>
<td> <field/> </td>
</field-splice>
</tr>
</row-splice>
</table>
rowSplice = do
rows <- lift getRowsFromDB
mapSplices (\row -> runChildrenWith [("field-splice", fieldSplice row)]) rows
fieldSplice rowId = do
fields <- lift $ getFieldsFromDB rowId
mapSplices (\f -> runChildrenWith [("field", fieldToText f)]) fields
但实际上并不需要它,因为数据来自无模式的mongodb并转换为映射:
fromList [("FieldName1","Value1"),("FieldName2","Value2"),("FieldName3","Value3")]
更新2:
我尝试了一些建议的例子,但运气不佳,我只是在一列中获得了所有数据。
我只需要一个简单的内部和外部循环来动态生成字段和行。
再简单不过了:
<% @rows.each do |row| %>
<tr>
<% row.each do |field| %>
<td> <%= field %> </td>
<% end %>
</tr>
<% end %>
更新3:
经过一个漫长的周末休息,我终于破解了它。。。
这是一个例子。它是mongodb特有的,我只是复制并粘贴了它。
但是如果有人被内环/外环卡住了,我想这会很有帮助
showTableH :: AppHandler ()
showTableH = do
table <- liftIO $ fetchTable tname
docs <- liftIO $ getColList tname
let rowSplice doc = mapSplices (\f -> fieldSplice $ T.pack $ at f doc) (tableFields table)
where fieldSplice field = runChildrenWithText [("field", field)]
let listRowsSplice = mapSplices (\d -> runChildrenWith [("fields", rowSplice d)]) docs
heistLocal (bindSplices [("rows", listRowsSplice)]) $ render "show-table"
showTableH::AppHandler()
showTableH=do
表runChildrenWith[(“字段”,第行)]文档
heistLocal(绑定拼接[(“行”,ListRowsPlice)])$render“显示表格”
我认为这里的关键是使用Map剪接和runChildrenWith。我想它会像这样:
<table>
<row-splice>
<tr>
<td> <field1/> </td>
<td> <field2/> </td>
<td> <field3/> </td>
</tr>
</row-splice>
</table>
<table>
<row-splice>
<tr>
<field-splice>
<td> <field/> </td>
</field-splice>
</tr>
</row-splice>
</table>
rowSplice = do
rows <- lift getRowsFromDB
mapSplices (\row -> runChildrenWith [("field-splice", fieldSplice row)]) rows
fieldSplice rowId = do
fields <- lift $ getFieldsFromDB rowId
mapSplices (\f -> runChildrenWith [("field", fieldToText f)]) fields
rowspile=do
行runChildrenWith[(“字段拼接”,字段拼接行)])行
fieldSplice rowId=do
字段runChildrenWith[(“字段”,fieldToText f)]字段
非常感谢,但仍然不起作用。。我玩了一天了,运气不好。我显然做错了什么。在您的示例中,正如我所看到的,在一行中只有内部“循环”生成字段。现在,内部“循环”应该与生成表内行的外部循环一起运行。我只是不知道如何把两者联系起来。所以内部的“mapplicates”应该创建一行,外部的“mapplicates”应该创建一个表。试试看,非常感谢。我也把它破解了。。。即使您的第一个示例对我帮助很大,我也知道了如何嵌套“runChildren”函数。再次感谢。