我有一个名为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
类型(就像我的其他模板一样)?
答案 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
的结果。