Scala Play按字符串名称加载部分模板

时间:2016-01-26 22:33:06

标签: scala playframework playframework-2.0 template-engine

我有一个像这样的Scala模板......

@()
import view.html.partials._header
import view.html.partials._footer

<!DOCTYPE html>
<html lang="en">

    @_header()

    /* Body of web page */

    @_footer

</html>

每个页面都有相同的页眉和页脚以及不同的正文。我不想这样做......

Page#1 ...

@()
import view.html.partials._header
import view.html.partials._footer
import view.html.partials._body1

<!DOCTYPE html>
<html lang="en">
    @_header()
    @_body1()
    @_footer
</html>

Page#2 ...

@()
import view.html.partials._header
import view.html.partials._footer
import view.html.partials._body2

<!DOCTYPE html>
<html lang="en">
    @_header()
    @_body2()
    @_footer
</html>

第3页......

@()
import view.html.partials._header
import view.html.partials._footer
import view.html.partials._body3

<!DOCTYPE html>
<html lang="en">
    @_header()
    @_body3()
    @_footer
</html>

有没有办法传递要作为参数呈现的部分模板的名称?这个问题的解决方案是什么?

P.S。我没有在...... the play template documentation

中看到解决方案

2 个答案:

答案 0 :(得分:2)

您可以创建一个main.scala.html文件作为默认布局,而不是完成所有这些重复:

@(title: String)(content: Html)

@import view.html.partials._header
@import view.html.partials._footer

<!DOCTYPE html>

<html lang="en">

    @_header()

    <body>

        @content

        @_footer()

    </body>
</html>

第一行确切地说#34;这个视图将收到一个标题参数,还有一个HTML&#34;。从那以后,您可以执行以下操作:

页面#1:

@(someParameter: String)

@main("The title of Page #1") {

    <h1>Hello, I'm the body of Page #1</h1>

    <p>As you can see, I'm calling the main view passing 
       a title and a block of HTML</p>

}

第2页:

@(someParameter: String, anotherParameter: Long)

@main("This time Page #2") {

    <h1>Hello, I'm the body of Page #2</h1>

    <p>Just like Page #1, I'm passing a title
       and a block of HTML to the main view.</p>

}

这些都在文档中解释,但在另一页中解释:

https://www.playframework.com/documentation/2.0/ScalaTemplateUseCases

答案 1 :(得分:-1)

制作像这样的开关或案例陈述......

@(bodyCase: ClosedEnumType)

import view.html.partials._header
import view.html.partials._footer
import view.html.partials._body1
import view.html.partials._body2

<!DOCTYPE html>
<html lang="en">

    @_header()

    @bodyCase match {
      case Body1() => {
          @_body1()
      }
      case Body2() => {
          @_body2()
      }
    }

    @_footer

</html>