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