Scala Play 2.4视图渲染vs应用



我注意到views.html.myView.render(...)views.html.myView(...)都可以用来从模板生成页面。然而,如果我们需要传递一个隐式参数列表到视图中,似乎只有apply版本工作,而render版本不编译。

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

render方法意味着从Java中使用,apply意味着从Scala中使用。将委托呈现给apply,它们将具有完全相同的签名,除非有多个参数列表(来自柯里化或隐式)。

假设我有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)

最新更新