Play Framework 2模板语言非常好用。然而,虽然它的灵感来自于微软的Razor语言,但一个重要的设计决策是不同的:你如何“逃回”HTML。 Razor寻找HTML风格的标签,Play 2使用某种启发式。
我正在尝试编写一个模板,该模板采用HTML的多个“部分”,并生成包含标题和目录的页面。我的'structuredpage.scala.html'看起来像这样:
@(title: String)(sections: Pair[String,Html]*)
@main(title){
<nav class="page-links">
@makeTableOfContents(sections)
</nav>
@for(section <- sections){
<section id="@section._1">
<h2>@section._1</h2>
@section._2
</section>
}
}
请注意,其第二个参数是部分的变量数。 not 似乎是一种在Play模板语言中调用它的方式。
我创建了一个名为Common.section
的辅助函数,如下所示:
def section(title: String)(content: Html) = title -> content;
我试过这个:
@()
@import views.Common.section
@structuredpage("Dashboard")(
section("Latest Requests") {
<p>Blah</p>
},
section("Your Details") {
<p>Blah blah</p>
}
)
...在第5行给出type mismatch; found : scala.xml.Elem required: play.api.templates.Html
,即<p>Blah</p>
被解释为Scala,而不是模板文档HTML。
而且:
@()
@import views.Common.section
@structuredpage("Dashboard"){
@section("Latest Requests") {
<p>Blah</p>
},
@section("Your Details") {
<p>Blah blah</p>
}
}
...在第3行给出type mismatch; found : play.api.templates.Html required: (String, play.api.templates.Html)
,即整个外部curley-brace块被解释为模板文档HTML,而不是作为Scala代码!
令人沮丧的是,他们似乎与官方Play 2文档中的一些代码示例没有太大的不同,例如:http://www.playframework.org/documentation/2.0/ScalaTemplateUseCases
有什么想法吗?我正在使用Play Framework 2.0.4
答案 0 :(得分:1)
这是你可能正在寻找的东西。它不完全是FP但
structuredpage.scala.html
@(title: String)(content: scala.collection.mutable.MutableList[Pair[String, Html]] => Unit)
@main(title){
@defining(new scala.collection.mutable.MutableList[Pair[String,Html]]()) { sections =>
@content(sections)
@for(section <- sections){
<section id="@section._1">
<h2>@section._1</h2>
@section._2
</section>
}
}
}
frontpage.scala.html
@()
@import views.Common.section
@structuredpage("Front Page") { implicit sections =>
@section("Section 1") {
<h1>stuff</h1>
}
@section("Section 2") {
<h1>more stuff</h1>
}
}
节方法:
def section(title: String)(content: Html)(implicit sections: scala.collection.mutable.MutableList[Pair[String, Html]]) {
sections += title -> content
}
答案 1 :(得分:0)
我现在无法在这台机器上测试,但以下情况应该有效(不需要辅助方法):
@()
@structuredpage("Dashboard"){
("Latest Requests", {
<p>Blah</p>
}),
("Your Details", {
<p>Blah blah</p>
})
}
答案 2 :(得分:0)
这是一种解决方法:
@import views.Common.section
@sec1 = { <p>Blah</p> }
@sec2 = { <p>Blah blah</p> }
@structuredpage("Dashboard")(
section("Latest Requests")(sec1),
section("Your Details")(sec2)
)
之前的尝试:
我认为你的愿望使它变得复杂。模板应该很简单。这是一个简单的替代方案:
index.scala.html
@structuredpage("Dashboard"){
@section("Latest Requests") {
<p>Blah</p>
}
@section("Your Details") {
<p>Blah blah</p>
}
}
section.scala.html
@(title: String)(content: Html)
<section id="@title">
<h2>@title</h2>
@content
</section>
structuredpage.scala.html
@(title: String)(sections: Html)
@main(title){
<nav class="page-links">
table-of-contents goes here
</nav>
@sections
}
我提出了一个要点:https://gist.github.com/4280577。所以你可以看看它并玩它。