处理Scala播放模板中的选项

处理Scala播放模板中的选项,scala,playframework,playframework-2.0,playframework-2.1,Scala,Playframework,Playframework 2.0,Playframework 2.1,我正在尝试在Scala播放模板中引用option类型的内容。我一直在尝试使用此资源: 这就是我试图引用case类中的字段的方式: @{optionalobject ?. field} 它不起作用,这是我得到的错误: ';' expected but '.' found. 我不确定为什么会出现这个错误 从您的标签判断,您使用的是Play 2.x变体,但您引用的是Play 1.x模块的文档 假设你的类型匹配,我相信你想要的是: @optionalobject.getOrElse(field)

我正在尝试在Scala播放模板中引用option类型的内容。我一直在尝试使用此资源:

这就是我试图引用case类中的字段的方式:

@{optionalobject ?. field}
它不起作用,这是我得到的错误:

';' expected but '.' found.

我不确定为什么会出现这个错误

从您的标签判断,您使用的是Play 2.x变体,但您引用的是Play 1.x模块的文档

假设你的类型匹配,我相信你想要的是:

@optionalobject.getOrElse(field)

对于可以跨多行的稍微好一点的格式(如果需要):

如果未定义字段,则不想显示任何内容:

@for(o <- optionalObject) {
  @o.field
}

(o的另一种可能性是使用map,我更喜欢这种语法与HTML混合使用

@pagination.next.map { next =>
  <a href="@Routes.paginated(next)">
    @HtmlFormat.escape("Next >>>")
  </a>
}
@pagination.next.map{next=>
}

有时,在处理
选项时,编写一个简短的帮助程序来分离模板代码可能比较方便:

  // Helper object is defined in some file Helper.scala
  object Helper {
    def maybeAttribute[T](attrName:String, maybeValue:Option[String]) = 
       maybeValue.fold("") { value => 
         Html(attrName + "=" + value).toString()
       }
  }
然后模板可以直接使用这个助手方法,就像

  // some view.scala.html file
  <div @Helper.maybeAttribute("id",maybeId)>
  </div>
//some view.scala.html文件

这不起作用。它是说该字段不存在。但是,它必须存在。当只输出case类时,它会显示case类的所有字段。@Lilluda5编辑您的问题并显示更多的代码。您如何声明
optionalobject
field
?用于显示的第二个代码段ng如果字段没有定义,用例很可爱。我一直在掩饰
Option
是一种集合类型这一事实,允许您这样做。
  // Helper object is defined in some file Helper.scala
  object Helper {
    def maybeAttribute[T](attrName:String, maybeValue:Option[String]) = 
       maybeValue.fold("") { value => 
         Html(attrName + "=" + value).toString()
       }
  }
  // some view.scala.html file
  <div @Helper.maybeAttribute("id",maybeId)>
  </div>