Play Framework模板没有Html类型

时间:2014-10-09 19:33:14

标签: scala playframework-2.0

我有一个名为mainBody的模板,其格式为:

@(title: String)(html: Html, moreScripts: Html = Html(""))

我可以称之为

views.html.mainBody("All properties")(views.html.showProperties(list))

views.html.showProperties()是另一个模板。我的印象是模板只是返回Html的函数。但是,如果我将其扩展为:

views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts)

views.html.showPropertiesScripts只是一个带有一些HTML代码的模板,我收到错误:

play.PlayExceptions$CompilationException: Compilation error[type mismatch;
 found   : views.html.showPropertiesScripts.type
 required: play.twirl.api.Html]
        at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
        at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
        at scala.Option.map(Option.scala:145) ~[scala-library-2.11.2.jar:na]
        at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:234) ~[na:na]
        at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:229) ~[na:na]

我不明白这一点。 Html取代预期类型views.html.showPropertiesScripts而不是views.html.showPropertiesScripts.type?这是什么以及为什么views.html.showPropertiesScripts不属于Html类型(就像我的其他模板一样)?

2 个答案:

答案 0 :(得分:3)

mainBody.scala.html

一样使用它
@(title: String, moreScripts: Html = Html(""))(html: Html)
<!DOCTYPE html>
<html>
    <head lang="en">
      <title>@title</title>
      @moreScripts
    </head>
    <body>
       @html
    </body>
</html>

观点:

@(list: List[YourType])

@moreScripts = {
    <script>alert ('it works')</script>
}

@mainBody(title = "All properties", moreScripts = moreScripts) {
    @showProperties(list)
}

由于moreScripts是可选的,您可以在其他视图中跳过它:

@(list: List[YourType])

@mainBody(title = "Other view") {
    @showProperties(list)
}

答案 1 :(得分:1)

我认为你正在混淆&#34;输入&#34;用&#34;返回类型&#34;。大概是views.html.showPropertiesScripts是一个不带任何参数的模板(它以@()开头)。如果是这种情况,则它没有Html类型,而是具有def apply(): Html的类,这就是为什么当您&#34;调用&#34;它带括号,返回Html。您可以将其视为类型() => Html。你应该试试:

views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts())

您可能会对calling a method without a parameter list的概念感到困惑。这在处理apply时无效,因为如果您关闭参数列表,Scala会将您解释为引用对象本身,而不是apply的结果。