为什么不将多个HTML参数传递给模板

时间:2014-01-03 14:33:07

标签: scala playframework-2.0

我知道thisthis,但答案很奇怪,无论如何,我希望了解为什么这种特殊方法不起作用:

@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

我必须缺乏对模板引擎规则的基本理解,因为这对我来说似乎是直观的。

2 个答案:

答案 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)