我有一个Map<Key, ObjectWithProperties> data
. 我们假设它ObjectWithProperties
有两个字段:foo
和bar
。
我想在这样的表格中呈现它:
Field | Key1 | Key 2 | Key 3
-------+--------+--------+-------
foo | Value1 | Value2 | Value3
bar | ... | ... | ...
本质上,对于 中的每个字段ObjectWithProperties
,我想为每个映射条目输出该值。
我想出了这个:
@**
* Renders a table row with the given label and data supplied by each object.
* @param label The row label.
* @param lookup The function that returns the required data as a String.
*@
@renderRow(label: String, lookup: (Key => String)) = {
<tr>
<td>@label</td>
@for(key <- data.keySet) {
<td>
@lookup(key)
</td>
}
</tr>
}
和:
<tbody>
@renderRow("Status", key => renderRow(data.get(key).status))
@renderRow("Last update", key => renderRow(data.get(key).lastUpdate))
...
</tbody>
这可行,但对于某些字段,我想获取字段值,而不仅仅是输出纯字符串,而是一些 HTML 标记(因此我可以添加工具提示等)。我想出了这个:
@**
* Renders a table row with the given label and HTML supplied by each object.
* @param label The row label.
* @param lookup The function that returns the required data as a String.
*@
@renderHtmlRow(label: String, lookup: (Key => Html)) = {
<tr>
<td>@label</td>
@for(key <- data.keySet) {
<td>
@lookup(key)
</td>
}
</tr>
}
例如:
@**
* Converts the given status to an nicely presented HTML representation.
* @param status The status.
* @return HTML content.
*@
@statusHtml(status: Status) = @{
Html(status match {
case Status.SCHEDULED => """<span class="label label-success">Scheduled</span>"""
case Status.COMPLETED => """<span class="label label-info">Completed</span>"""
case Status.CANCELLED => """<span class="label label-warning">Cancelled</span>"""
})
}
并呈现为:
@renderHtmlRow("Status", key => statusHtml(data.get(key).status))
问题是我在谈到renderRow
和renderHtmlRow
时重复了自己- 这些方法是相同的,因为一个接受(Key, String)
,另一个接受(Key, Html)
。
理想情况下,renderRow
应该只委托给renderHtmlRow
. 但是,我不确定如何解决这个问题。
我怎样才能改变我的lookup: (Key -> String)
为 a (Key -> Html)
(并且,以一种仍然逃避字符的方式)。
(或者,有没有更好的方法?)