加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 播放模板仅在使用括号调用时才有效

发布时间:2020-12-16 18:06:06 所属栏目:安全 来源:网络整理
导读:我的应用程序控制器中有以下代码: def index = Action { var ticketsAvailable = 1 Ok(views.html.index) } 当我尝试运行该应用程序时,我收到此编译错误: Cannot write an instance of views.html.index.type to HTTP response. Try to define a Writeable
我的应用程序控制器中有以下代码:

def index = Action {
    var ticketsAvailable = 1
    Ok(views.html.index)
  }

当我尝试运行该应用程序时,我收到此编译错误:

Cannot write an instance of views.html.index.type to HTTP response. Try to define a Writeable[views.html.index.type]

在线上

Ok(views.html.index)

但是,当我添加括号(如下所示)时,错误消失:

Ok(views.html.index())

这是为什么?
我认为,在Scala中,当没有参数时,括号的用法是可选的.

解决方法

查看生成的Scala代码以获取名为index.scala.html的简单Twirl模板(Twirl是Play模板引擎)可能是有益的:

@()

<h1>Hello,world</h1>

默认情况下,Play会将此编译为target / scala-2.11 / twirl / main / views / html / index.template.scala中的Scala文件,如果清理一下以删除源映射(这会启用编译错误)在要转换为输入文件中右行的模板中,它看起来像这样:

package views.html
import play.twirl.api._

object index_Scope0 {
  import models._
  import controllers._
  import play.api.i18n._
  import views.html._
  import play.api.templates.PlayMagic._
  import play.api.mvc._
  import play.api.data._

  class index
    extends BaseScalaTemplate[play.twirl.api.HtmlFormat.Appendable,Format[play.twirl.api.HtmlFormat.Appendable]](play.twirl.api.HtmlFormat)
    with play.twirl.api.Template0[play.twirl.api.HtmlFormat.Appendable] {

    def apply(): play.twirl.api.HtmlFormat.Appendable = {
      _display_ {
        {
          Seq[Any](format.raw(""""""),format.raw("""<h1>hello,world</h1>"""))
        }
      }
    }

    def render(): play.twirl.api.HtmlFormat.Appendable = apply()
    def f: (() => play.twirl.api.HtmlFormat.Appendable) = () => apply()
    def ref: this.type = this
  }
}

object index extends index_Scope0.index

需要注意的重要一点是,views.html.index是一个对象,其类型为views.html.index.type,如果你不添加parens,那就是你所引用的.但是,这个对象扩展了一个名为views.html.index_Scope0.index的类,它有一个apply()方法,它返回一个Html对象(或者更确切地说,是HtmlFormat.Appendable,它是非混淆类型.)

如果你“调用”一个Scala对象,Scala会转换(或“去糖”)来调用对象上的apply()方法(这就是case类构造函数在不使用new的情况下工作的方式.)因此,如果你使用parens你获取一个Html对象,它是渲染的Twirl模板的结果.如果不这样做,您只需获取已编译的模板对象,Play不知道如何写入HTTP响应.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读