【问题标题】:Why doesn't this pass multiple HTML parameters to template为什么这不将多个 HTML 参数传递给模板
【发布时间】:2014-01-21 06:11:16
【问题描述】:

我知道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

我一定对模板引擎的规则缺乏基本的了解,因为这在我看来直觉上是正确的。

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      @ 字符标志着动态语句的开始,因此您不再使用模板语法。它试图将 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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-17
        • 2020-01-28
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多