Scala Play 2.4 视图渲染与应用

Scala Play 2.4 view render vs apply

我注意到 views.html.myView.render(...)views.html.myView(...) 都可用于从模板生成页面。但是,如果我们需要将隐式参数列表传递到视图中,似乎只有 apply 版本有效,而 render 版本无法编译。

我假设 views.html.myView.apply 可能在幕后委托给 views.html.myView.render(或相反),但我不确定并且在文档中找不到与此相关的任何内容。我唯一能从 Twirl 文档中得到的是 TemplateN 特征都定义了 render 方法,但是 none 其中提到了 apply.

render 方法旨在从 Java 中使用,而 apply 旨在从 Scala 中使用。将委托呈现给 apply,它们将具有完全相同的签名 ,除非 有多个参数列表(来自 currying 或 implicits)。

假设我有来自 play-scala 激活器模板的 index.html.scala,修改为添加隐式 Int 参数:

@(message: String)(implicit i: Int)

它将被编译为 target/scala-2.11/twirl/main/views/html/index.template.scala。以下是相关部分:

def apply(message: String)(implicit i: Int): play.twirl.api.HtmlFormat.Appendable = ...

def render(message: String, i: Int): play.twirl.api.HtmlFormat.Appendable =
    apply(message)(i)

render 中的参数被压缩到一个列表中。由于您不能使用 Java(或多个参数列表)中的隐式,因此需要在单个列表中显式传递它们。

如果我删除隐含的,它们是相同的:

def apply(message: String): play.twirl.api.HtmlFormat.Appendable = ...

def render(message:String): play.twirl.api.HtmlFormat.Appendable = apply(message)