好吧,这是我努力克服的编译拼接的另一个障碍。当我第一次使用原始的解释拼接时遇到了一些麻烦,现在我被困在将它翻译成编译的变体。
这里描述了原始问题:渲染表格
所以我需要构建这种结构:
map (\doc -> fmap (\f -> splice $ f at doc) fields ) documents
这只是外部和内部循环,外部渲染原始数据和内部渲染单元。这一切都在原始链接中进行了描述。
它目前以解释模式实现,如下所示:
tableRawS raw = mapSplices (\f -> tableCellS $ T.pack $ at f raw) (tableFields table)
where tableCellS cell = runChildrenWithText $ "table-cell" ## cell
tableBodyS = mapSplices (\d -> runChildrenWith $ raws d) documents
where docID d = T.pack $ show $ valueAt "_id" d
raws d = do "table-raw" ## tableRawS d
"raw-id" ## textSplice $ docID d
我已经挣扎了几天了,没有结果。这可能是由于缺乏对编译拼接 API 的理解。请帮忙!
编辑
我没有为我的问题提供足够的细节。我设法得到的上述解释变体的最佳近似值是:
tableBody = manyWithSplices runChildren tableRaw $ lift documents
tableRaw doc = do "table-raw" ## manyWithSplices runChildren rawCell $ lift labels
where rawCell label = "table-cell" ## pureSplice . textSplice $ at label doc
"table-rawid" ## pureSplice . textSplice $ at "_id" doc
where oid = T.pack . show. valueAt "_id"
这没用!问题是翻译原始渲染函数,即 tableRaw。所以我会提供更多细节。我输入 tableBody 的数据是一个类似 Map 的结构列表:
document = ["_id" =: 12345, "name" =: "pretty", "model" =: "cool", "size" =: "big"]
因此,要以原始形式提取数据,我需要映射标签列表
map (\l -> at l document) labels
我可以毫无问题地使用解释的变量来做到这一点。tableRawS 的解释示例由文档参数化,但映射到 [labels]。我无法在编译的变体中实现这一点。我需要 tableRaw 函数中存在的文档和标签列表,以便我可以将不同的单元格拼接从文档中绑定出来。这是真正的痛苦。我不知道该怎么做。无论我做什么,我最终都会在文档上映射 tableRaw,而不是在标签列表上映射。
基本上。我从具有上述文档结构的数据库中获取 [document],并从数据库中获取标签,其中
labels = ["name", "model", "size"] -- table fields
我使用“at :: Label -> Value”从文档中获取数据 有了这些,我该如何呈现这个模板:
<table class="table" data-title=${table-name}>
<thead>
<tr>
<th>#</th>
<table-head>
<th> <table-hcell/> </th>
</table-head>
</tr>
</thead>
<tbody>
<table-body>
<tr data-oid=${table-rowid}>
<td> <input type="checkbox"/> </td>
<table-raw>
<td> <table-rcell/> </td>
</table-raw>
</tr>
</table-body>
</tbody>