【问题标题】:Scala Play 2.4 view render vs applyScala Play 2.4 查看渲染与应用
【发布时间】:2015-09-26 23:18:11
【问题描述】:

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

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

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

    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)
    

    【讨论】:

    • 不错的答案!这就解释了为什么render 无法编译,尽管我在范围内有适当的隐式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多