0

我正在使用 play-2.0.3。
我有一个地图,想用 Int->String 填充下拉列表(使用类似 @select 的东西)。
我知道 @select 只接受 Seq[(String, String).
我怎样才能重载这个助手来接受 Seq[(Int, String)] ?

我试图做以下事情:

  1. 将 select.scala.html 的源代码复制到 views/mySelect.scala.html
  2. 出于我的目的对其进行了编辑。
@**
* Generate an HTML select.
*
* Example:
* {{{
* @select(field = myForm("isDone"), options = options("Yes","No"))
* }}}
*
* @param field The form field.
* @param args Set of extra attributes.
* @param handler The field constructor.
*@
@import helper._

@(field: Field, options: Seq[(Int,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang)

@input(field, args:_*) { (id, name, value, htmlArgs) =>
    <select id="@id" name="@name" @toHtmlArgs(htmlArgs)>
    @args.toMap.get('_default).map { defaultValue =>
        <option class="blank" value="">@defaultValue</option>
    }
    @options.map { v =>
        <option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option>
    }
    </select>
}

但这似乎不起作用。

玩 说

')' expected but identifier found. 

在行中

@(field: Field, options: Seq[(Int,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang) 

顺便说一下(Symbol,Any)之后的 * 是什么?
玩不喜欢。即使我删除了这个*,play 也会说:

 not found: value field 

引用同一行。

请帮帮我。

4

2 回答 2

1

删除 "@import helper._" 。每个 scala 模板文件都是后台的一个函数。“@(field: Field, options: Seq[(Int,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang)" 行必须是第一行线。

于 2012-11-07T06:20:34.680 回答
0

我找到了解决方案。

@**
* file views/mySelect.scala.html 
*
* Generate an HTML select.
*
* Example:
* {{{
* @select(field = myForm("isDone"), options = options("Yes","No"))
* }}}
*
* @param field The form field.
* @param args Set of extra attributes.
* @param handler The field constructor.
*@


@(field: Field, listOptions: Map[Integer,String], args: (Symbol,Any)*)(implicit handler: views.html.helper.FieldConstructor, lang: play.api.i18n.Lang)
@import helper._
@input(field, args:_*) { (id, name, value, htmlArgs) =>
    <select id="@id" name="@name" @toHtmlArgs(htmlArgs)>
    @args.toMap.get('_default).map { defaultValue =>
        <option class="blank" value="">@defaultValue</option>
    }
    @listOptions.map { v =>
        <option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option>
    }
    </select>
}
  • (Symbol,Any)*表示“视为可变参数”。当你有一个可变参数函数时使用它,比如

    def varargfunc( argument : T* ) ...
    
  • 现在我们可以

    @import mySelect 
    

    并像使用它一样

    @mySelect(
        userForm("room"), 
        rooms, @* Map<Integer, String>* rooms*@ 
        '_default -> Messages.get("chooseRoom"),
        '_showConstraints -> false
        )
    
  • 是的,我们应该只在函数声明之后(在函数体中)使用@import 。

  • 不要使用变量名

    options: Map[Integer,String]
    

    随着

    @import helper._ 
    

    因为它会导致选项的模糊感,因为它也是来自views.html.helper的函数

于 2012-11-07T11:06:30.550 回答