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)*は、「varargパラメーターとして扱う」を意味します。次のような可変引数関数がある場合に使用します

    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 に答える