2013-10-08 40 views
1

我有Map<Key, ObjectWithProperties> data。我們假設ObjectWithProperties有兩個字段:foobar呈現表格中對象圖的屬性(或將(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)) 

的問題是,我重複自己,當它涉及到renderRowrenderHtmlRow - 這些方法是相同的,因爲接受(Key, String)而另一個接受(Key, Html)

理想情況下,renderRow應該只是委託給renderHtmlRow。但是,我不知道如何解決這個問題。

如何將我的lookup: (Key -> String)轉換爲(Key -> Html)(並且仍然可以轉義字符)。

(或者,有沒有更好的辦法?)

+0

Try @Html(lookup(key)) –

+0

@ajozwik:1)不確定你在暗示我在做什麼 - 你是否打算用這個調用來替換renderRow函數的主體? 2)在一個值上調用HTML將意味着'''(和其他HTML字符)不會被轉義 - 這與我想要的非HTML呈現功能是相反的。 –

+1

我會建議完全刪除你的'renderRow'助手,只使用'renderHtmlRow'助手。要做到這一點,你需要在你傳遞文本之前將你想要呈現的Html文本轉義爲:'@renderHtmlRow(「Status」,key => SomeHtmlUtil.escapeHtml(data.get(key).status) )'這將取代調用'@renderRow(「Status」,key => renderRow(data.get(key).status))'有很多HTML轉義工具可用來做這個小事。 – torbinsky

回答

0

以下的伎倆(用於播放2.2):

@renderRow(label: String, lookup: (Key => BufferedContent[_])) = { 
    <tr> 
    <td>@label</td> 
    @for(key <- data.keySet) { 
     <td>@lookup(key)</td> 
    } 
    </tr> 
} 

,並呼籲像這樣:

@renderRow("Status", statusHtml(data.get(key).status)) 

其他文本(並且將被正確地HTML轉義):

@renderRow("Status", Txt(data.get(key).foo)) 
相關問題