2.1.4-java-如何将@options helper与Map一起使用<;字符串,字符串>;作为参数

2.1.4-java-如何将@options helper与Map一起使用<;字符串,字符串>;作为参数,java,playframework,Java,Playframework,我正在创建一个自定义HTML来获取电话号码的输入。这应该是一个带有电话类型选择框和电话号码文本框的控制组。布局需要与内置HTML助手@select和@inputText所做的不同。因此,我的代码如下所示: @phoneGroup(field: Field, className: String = "phone") = { <div class="control-group"> <label class="control-label" for="@field("typ

我正在创建一个自定义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)
}
<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>
在生成的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>

电话号码
(MAI,Main)(移动,移动)(传真,传真)(客户,海关)
显然,@options只是输出了我在models.PhoneType.options中传递给它的映射的字符串表示形式。所以问题是,如何使用@options helper生成以下HTML:

<option value="MAI">Main</option>
<option value="MOB">Mobile</option>
<option value="FAX">Fax</option>
<option value="CUS">Custom</option>
Main
可移动的
传真
习俗
我是一名Java程序员,没有任何Scala经验。这可能是一件小事,但我没有找到任何例子

先谢谢你。 -德米特里


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

@选项只是一个对象,不处理HTML本身的输出。这是在传递选项对象的“选择”辅助对象中完成的。如果不能使用@select,可以从源中复制相关位

谢谢你的线索,大卫。我没有使用@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>

@选项(models.PhoneType.options).map{v=>
@v、 _2
}
唯一需要注意的是,我必须使用一些(v._1)作为inputRadioButtonGroup代码(),否则比较就不起作用。我必须学习一点scala才能理解这是为什么:)

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

@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)
}
<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>

@for((值,文本)