我知道this和this,但答案很奇怪,无论如何,我希望了解为什么这种特殊方法不起作用:
@myPackage.views.html.ol(
{
Hello
}, {
World
}
)
myPackage.views.html.ol.scala.html
@(ol:Html*)
<ol>
@for(li <- ol) {
<li>
(hi)
<span class="li-body">@li</span>
</li>
}
</ol>
错误:
not found: value Hello
我必须缺乏对模板引擎规则的基本理解,因为这对我来说似乎是直观的。
答案 0 :(得分:1)
@
字符标记动态语句的开头,因此您不再使用模板语法。它试图将ol()
函数的参数解释为直接的Scala / Java代码,而不是模板语法。
这取决于你究竟想做什么,但这有两种方法可以做到。您也可以使用@defining
帮助程序。
@myPackage.views.html.ol(Html("Hello"), Html("World"))
另一种方法是在视图的开头定义Html块。
@html1 = { Hello }
@html2 = { <strong>World</strong> }
@main(){
@myPackage.views.html.ol(html1, html2)
}
答案 1 :(得分:1)
estimatic的答案是正确的。
在他提出的内容中,我可能会使用@html1 = ...
解决方案,但我找到了其他的东西,我希望这对未来的读者有所帮助。
<强> HtmlVarArgs.scala 强>
import play.api.templates.Html
import scala.collection.mutable.ListBuffer
class HtmlVarArgs(html: Html) {
private val templates = ListBuffer(html)
def apply(html: Html) = {
templates += html
this
}
def passTo(f: Seq[Html] => Html) = f(templates)
}
object HtmlVarArgs {
def apply(html: Html) = new HtmlVarArgs(html)
}
<强> ol.scala.html 强>
myPackage.views.html.ol.scala.html
@(ol:Html*)
<ol>
@for(li <- ol) {
<li>
(hi)
<span class="li-body">@li</span>
</li>
}
</ol>
然后我可以在模板中使用它,如下所示:
@HtmlVarArgs {
Hello
} {
World
}.passTo(myPackage.views.html.ol.apply)