2.1.4-java - 如何使用@options helper和Map <string,string =“”>作为参数</string,>

时间:2013-09-20 18:32:13

标签: java playframework

我正在创建自定义HTML以获取电话号码的输入。这应该是一个控制组,其中包含电话类型的选择框和电话号码的文本框。布局需要与内置HTML帮助程序@select和@inputText的布局不同。所以我的代码如下:

@phoneGroup(field: Field, className: String = "phone") = {
  <div class="control-group">
    <label class="control-label" for="@field("type").id">@Messages("company.phoneNumbers")</label>
    <div class="controls">
      <select id="@field("type").id" name="@field("type").name">
        @options(models.PhoneType.options)
      </select>
      <input type="text" id="@field("number").id" name="@field("number").name" value="@field("number").value">
    </div>
  </div>
}

我在下面的模板中将其称为如下:

@repeat(companyForm("phones"), min = 2) { phone =>
  @phoneGroup(phone)
}

在生成的HTML中,除了由

生成的部分外,到目前为止一切看起来都很好
@options(models.PhoneType.options)

这是一个生成的HTML:

<div class="control-group">
  <label class="control-label" for="phones_0__type">Phone numbers</label>
  <div class="controls">
    <select id="phones_0__type" name="phones[0].type">
      (MAI,Main)(MOB,Mobile)(FAX,Fax)(CUS,Custom)
    </select>
    <input type="text" id="phones_0__number" name="phones[0].number" value="">
  </div>
</div>

显然,@ options只输出我在models.PhoneType.options中传递给它的Map的字符串表示。所以问题是,如何使用@options helper生成以下HTML:

<option value="MAI">Main</option>
<option value="MOB">Mobile</option>
<option value="FAX">Fax</option>
<option value="CUS">Custom</option>

我是一名Java程序员,我对Scala没有任何经验。这可能是一件微不足道的事情,但我没有找到任何例子。

提前谢谢你。 - 德米特里

更新2013-11-07 - 在下面的“答案”部分中发布了解决方案

2 个答案:

答案 0 :(得分:0)

@options只是一个对象,不处理输出HTML本身。这是在传递options对象的“select”帮助器中完成的。如果您不能使用@select,则可以将相关位复制出源https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/views/helper/select.scala.html

答案 1 :(得分:0)

感谢大卫提供的线索。我没有使用@select的原因是因为它还在select标签周围生成了一些格式化HTML,我想控制布局组件。由于我没有弄清楚如何正确定制@select我现在就走这条路了。好的,正如你所建议的那样,我只是复制了Scala代码选项,它就是诀窍:

<select id="@field("type").id" name="@field("type").name" class="input-small">
    @options(models.PhoneType.options).map { v =>
        <option value="@v._1" 
            @if(Some(v._1) == (field("type").value)) { selected  }>@v._2</option>
    }
</select>

唯一的问题是,我必须在inputRadioButtonGroup代码(https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/views/helper/inputRadioGroup.scala.html)中使用Some(v._1),否则比较不起作用。我必须学习一点scala才能理解为什么:)

或者,for循环也可以,如下所示:

<select id="@field("type").id" name="@field("type").name" class="input-small">
    @for((value, text) <- models.PhoneType.options) {
        <option value="@value" 
            @if(Some(value) == (field("type").value)) { selected  }>@text</option>
    }
</select>