我有Map<Key, ObjectWithProperties> data
。我們假設ObjectWithProperties
有兩個字段:foo
和bar
。呈現表格中對象圖的屬性(或將(Key-> String)轉換爲(Key-> Html))
我想呈現一個表中,像這樣:
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)
轉換爲(Key -> Html)
(並且仍然可以轉義字符)。
(或者,有沒有更好的辦法?)
Try @Html(lookup(key)) –
@ajozwik:1)不確定你在暗示我在做什麼 - 你是否打算用這個調用來替換renderRow函數的主體? 2)在一個值上調用HTML將意味着'''(和其他HTML字符)不會被轉義 - 這與我想要的非HTML呈現功能是相反的。 –
我會建議完全刪除你的'renderRow'助手,只使用'renderHtmlRow'助手。要做到這一點,你需要在你傳遞文本之前將你想要呈現的Html文本轉義爲:'@renderHtmlRow(「Status」,key => SomeHtmlUtil.escapeHtml(data.get(key).status) )'這將取代調用'@renderRow(「Status」,key => renderRow(data.get(key).status))'有很多HTML轉義工具可用來做這個小事。 – torbinsky