I have a template named mainBody with the form:
@(title: String)(html: Html, moreScripts: Html = Html(""))
I'm able to call this like
views.html.mainBody("All properties")(views.html.showProperties(list))
views.html.showProperties() is another template. I'm under the impression that templates are just functions that return Html. However, if I extend this to:
views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts)
Where views.html.showPropertiesScripts is just a template with some HTML code, I get the error:
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]
I don't understand this. Instead of the expected type Html, views.html.showPropertiesScripts is views.html.showPropertiesScripts.type? What is this and why is views.html.showPropertiesScripts not of type Html (like my other templates)?
Use this like 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>
The view:
@(list: List[YourType])
@moreScripts = {
    <script>alert ('it works')</script>
}
@mainBody(title = "All properties", moreScripts = moreScripts) {
    @showProperties(list)
}
as moreScripts is optional you can skip it in the other view:
@(list: List[YourType])
@mainBody(title = "Other view") {
    @showProperties(list)
}
                        I think you're mixing up "type" with "return type". Presumably is views.html.showPropertiesScripts is a template that doesn't take any parameters (it starts with @()). If this is the case, it does not have type Html, but rather, it's a class with a def apply(): Html, which is why when you "call" it with parentheses, it returns Html. You can think of it as having type () => Html. You should try:
views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts())
You might be confused by the concept of calling a method without a parameter list. That can't work when dealing with apply, because if you leave the parameter list off, Scala interprets you as referring to the object itself, not the result of apply.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With