1

我是一个相当精通 Java 的编码器,进入 Play2 框架。

我正在定义一个小模板,我认为使用“选项”作为将命名参数传递给模板的一种方式看起来不错。

所以在我的模板(比如picker.scala.html)中,我使用了这些参数

@(field: Field, label: String, options: Seq[(String, String)])

在我使用它的页面上,我正在做

@picker(myForm("shoesize"), "Your Shoe Size", options("color" -> "black"))

问题:如何处理“picker”模板中的选项?我可以做类似 options.get("color") 的事情吗?

如果“RTFM”包含指向相关文档的指针,则它是一个完全有效的答案......

编辑:我发现我可以做@options.get(0)._2 等。我错过了使用选项的意义吗?有没有更好的方法来传递命名参数的映射而不是字符串、字符串对的序列?

解决了

感谢下面的回复,这就是我最终做的事情:

我的“选择器”模板现在有这个签名:

@(field: Field, 
  label: String, 
  options: Seq[(String, String)]=scala.collection.immutable.List())

也就是说,options 参数默认为一个空列表,因此这些选项是……好吧,可选的。

然后在选择器模板中寻找一个“可清除”选项,如下所示:

@if(options.toMap.get("clearable").getOrElse("false")=="true"){
    clearable is true
} else {
    clearable is not true
}

所以当我打电话给选择器时,我可以做

@picker(myForm("myField"), "Some Label")

或者

@picker(myForm("myField"), "Some Label", options("clearable" -> "true))

我不确定这对任何人都有帮助,或者是否有更好的方法,但这正是我想要的并且它有效。

4

2 回答 2

2

如果您需要从键访问值,使用 aMap[String, String]而不是 a会更容易Seq[(String, String)]

在您的代码中,它看起来像:

@(field: Field, label: String, options: Map[String, String])

@picker(myForm("shoesize"), "Your Shoe Size", Map("color" -> "black"))

然后您可以使用以下方式访问值:

@options("color")

或遍历地图:

@for((key, value) <- options) {
  @key - @value
}

请注意,您可以使用方法将 a 转换Seq[(String, String)]为 a (例如:)Map[String, String]toMapoptionsSeq.toMap

于 2013-09-13T08:23:28.030 回答
1

Seq在这种情况下,这不是你想要的。你真的在寻找一个Map.

@(field: Field, label: String, options: Map[String, String])

假设您将 Map("color" -> "black") 传递给picker事物。那么你可以这样写:

val color = options.get("color") //returns an Option[String]
color match {
  case Some(value) => System.out.println(value)
  case None => System.out.println("no value")
}

或者你甚至可以这样写:

val color = options.getOrElse("color", "default color")

它不适用于 Seq[(String, String)] 的原因是因为 (String, String)tuple大致如下所示:

class Tuple2[A, B](_1: A, _2: B)

所以你只是在制作一系列对象。与 Java 相比,ASeq是一种类似的结构。List在 Java 中,您不能通过List传递项目 ID 从 a 中获取项目,对吗?:)

于 2013-09-13T08:26:18.150 回答