【问题标题】:Calling a function as a parameter in a template call in Play在 Play 中的模板调用中调用函数作为参数
【发布时间】:2018-05-07 20:30:40
【问题描述】:

在 Play/Scala 中;我很困惑为什么这不会编译:

   @(tabNames: Seq[String])

   @isActive(idx: Int) = {
       @if(idx < 1) {
           "active"
       } else {
           ""
       }
   }

   <ul class="nav nav-tabs">
       @for((tab, idx) <- tabNames.zipWithIndex) {
           @views.html.generic.navLi("tab" + idx.toString, tab, isActive(idx))
       }
   </ul>

错误显示:

找到:play.twirl.api.HtmlFormat.Appendable [错误](其中 扩展为) play.twirl.api.Html [error] required: String [error]
@views.html.generic.navLi("tab" + idx.toString, tab, isActive(idx))

它无法识别模板调用中对isActive 的调用,我尝试了多种变体,例如@isActive(idx)isActive(@idx)${isActive(idx)}(建议here)等这个模板生成一个导航栏,传入选项卡名称并检查nav li是否应该是active(由类名配置/JS)。

似乎在另一个模板调用中调用函数时语法必须不同 - 我无法正确理解。

【问题讨论】:

    标签: scala templates playframework twirl play-templates


    【解决方案1】:

    Documentation区分

    • 可重用的代码块
    • 可重复使用的代码块

    注意@在用法上的细微差别

    @isActive(idx: Int) = {
      @if(...
    
    @isActive(idx: Int) = @{
      if(...
    

    可重用的纯代码块可以有任意的返回类型。在您的情况下,要将 String 作为返回类型,您可以编写:

       @isActive(idx: Int) = @{
           if(idx < 1) {
               "active"
           } else {
               ""
           }
       }
    

    【讨论】:

      【解决方案2】:

      Play documentation is a little light in this area;虽然在 twirl 模板中声明“函数”当然是可能且有用的,但返回类型似乎被锁定为(有效地)Html - 即您的“块”(如文档中所述)必须呈现 HTML .

      如文档中所建议的,最快的解决方案是将逻辑重定位到 Scala 类中;对于这样简单的事情,object 是完成此任务的最简单方法,即:

      package views
      
      object ViewHelper {
      
        def isActive(idx: Int):String = {
          if(idx < 1) {
            "active"
          } else {
            ""
          }
        }
      }
      

      和:

      <ul class="nav nav-tabs">
         @for((tab, idx) <- tabNames.zipWithIndex) {
             @views.html.generic.navLi("tab" + idx.toString, tab, ViewHelper.isActive(idx))
         }
      </ul>
      

      这种方法的优点包括可测试性和可重用性。请注意避免被ViewHelper 可以做的事情冲昏头脑——数据库查找等在这里是个坏主意! :-)

      【讨论】:

      • 是的 - 文档在这个主题上绝对是 light。你确定views 包是放置object 的最佳位置吗?我还注意到您没有导入ViewHelper - 对吗?谢谢
      • 通过将其放在views 我不需要来导入它:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2015-06-26
      相关资源
      最近更新 更多