3

我有一个菜单,我想根据系统中当前选择的帐户有所不同。

我有一个页面,允许用户从 html 选择中选择一个帐户。当用户从帐户选择页面提交表单时,我想调用控制器上的菜单方法,传入所选值,以便我的 url 看起来正确。

这是页面中允许用户选择帐户的现有模板:

@helper.form(action = routes.Accounts.menu {
    <table>
        <tr>
            <td><select id="accountNames">
                @accountNames.map { name =>
                    <option value="@name">@name</option>
                }
            </select></td>
        </tr>
        <tr>
            <td>
                <p>
                    <input type="submit" value="Choose">
                </p>
            </td>
        </tr>
    </table>
}

从我的路线文件中:

GET /account/:accountName/menu controllers.Accounts.menu(accountName: String)

如何从我的选择 (id="accountNames") 中引用选定的值并将其传递到我的表单操作中?

4

1 回答 1

4

实际上,我认为您这样做是错误的。

如果表单的操作必须改变使用您的“选择”,则必须使用 JS 来完成。因此,当提交表单(事件submit)时,您必须更新 url。

这可以很容易地使用javascriptRoutes.

所以你必须做几件事:

1/创建javascriptRouter(假设你添加它Application.scala

def javascriptRoutes = Action {
  Ok(
    Routes.javascriptRouter("playRoutes")(
      //accounts
      controllers.routes.javascript.Accounts.menu
    )
  ).as("text/javascript")
 }

2/ 在你的routes文件中定义它

# Javascript routing
GET     /assets/javascripts/routes      controllers.Application.javascriptRoutes

3/ 在您的视图中添加相关的 javascript 文件导入,让我们说main.scala.html

<script type="text/javascript" src="@routes.Application.javascriptRoutes"></script>

4/submit在执行默认行为之前向表单添加一个处理程序

$("form").submit(function () {
    //this computes the correct URL giving a parameter which is the value of the selected option
    var newURl = playRoutes.controllers.Accounts.menu($("#accountNames").val()).url
    $(this).attr("action", newUrl); 
})

注意我们是如何playRoutes在控制器 (1) 和 JS 调用 (4) 中使用的。

于 2012-06-04T13:07:38.893 回答