1

我有一个Map<Key, ObjectWithProperties> data. 我们假设它ObjectWithProperties有两个字段:foobar

我想在这样的表格中呈现它:

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)为 a (Key -> Html)(并且,以一种仍然逃避字符的方式)。

(或者,有没有更好的方法?)

4

1 回答 1

0

以下是诀窍(适用于 Play 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))
于 2014-05-28T12:35:34.300 回答