我注意到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)