【问题标题】:Setting selected entry using helper.options?使用 helper.options 设置选定的条目?
【发布时间】:2014-09-10 16:56:59
【问题描述】:

我正在使用 Play 2.0.4 和

helper.options(myitems)

在我的模板中(在 helper.select 中)

在这种情况下,如何定义默认选择的条目,它应该是myitems 中的一个条目?感谢您的任何提示!

更多关于我的案例:

想象一个新闻档案,显示所有新闻标题。此新闻存档使用分页,分页使用 GET 传递下一个/上一个页码。

然而,播放框架只会在使用 POST 请求时正确选择当前选择的“选择”项目(此处:新闻类别) - 而分页使用 GET!

预期行为:在应用过滤器/选择特定新闻类别时,通过在“选择”表单中预先选择当前选择的新闻类别,用户始终可以看到。

用于说明的“屏幕截图”:

那么,有谁知道如何解决这个问题?有什么方法可以手动告诉 Play 它应该从“选择”表单中选择哪个条目? '_default 总是添加一个新条目,而不是从给定的选项中选择一个):如果不必手动构建完整的“选择”表单,那就太好了。

【问题讨论】:

  • 正确创建的选择字段 + 选项将自动标记正确的项目,无论如何您的样本太短以确定出了什么问题
  • 我也想知道这个问题,猜想问题是我目前使用的是 GET 而不是 POST - 我列出了一些条目和页码等由 GET 传递,不知何故使用起来感觉很奇怪POST 过滤它们,也使用 POST 不能直接访问过滤的条目...
  • +1 用于绘图 :) 无论如何,要将值传递给视图,您可能首先需要从请求中读取它,对吧?即&cat=123我们现在很清楚你需要什么,不看代码就不可能说出问题所在
  • 好吧,错误的是我使用的是 GET 而不是 POST,我的代码并不特别):
  • 它与代码有关,要使用来自请求的数据,您需要以某种方式获取它(例如用于过滤 SQL 结果)。 GET/POST mischmash 可能在您的代码中的某个位置

标签: templates scala playframework


【解决方案1】:

尝试将'_default 选项传递给select 助手:

@import views.html.helper._

@select(form("email"), options(List("first", "third")), '_default -> "second")

不幸的是,似乎唯一的办法就是查找source

更新:

指定_default 属性不会在option 标记上设置selected 属性。看起来预选条目的唯一方法是将预填充的表单传递给模板。例如,假设您有以下形式:

case class RegInfo(email: String, color: String)

private val registrationForm = Form(
  mapping(
    "email"    → email,
    "color"    → nonEmptyText(minLength = 5, maxLength = 32)
  )(RegInfo.apply)(RegInfo.unapply)
)

然后在传递给视图之前的动作预填充表单中:

def create = Action {
  Ok(html.create(registrationForm.fill(RegInfo("user@qwe.com", "blue"))))
}

然后在模板中使用helper:

@select(form("color"), options(List("red", "green", "blue")))

并且值将被预选。

【讨论】:

  • 其实在play入门文档里有,但是这个方法的问题是,默认条目不是正常条目的一部分。不知何故,Play 似乎期望使用 POST 而不是 GET,然后会自动选择正确的条目。问题是我目前没有使用 POST ;-)
  • 我已经更新了我的答案。可能它会为你工作。请告诉我们更多关于您的案例。
  • 谢谢!我在原始帖子中添加了更多详细信息。您可以将您的解决方案发布为 Java 吗?或者也许你有一个全新的想法,因为我为我的问题添加了更多细节。 :-)
【解决方案2】:

以务实的方式结束:

<select id="myfield" name="myfield" >

    <option class="blank" value="">-- All items --</option>

    @for((key, value) <- MyModel.options) {

        @if(key == GETValuePassedToTemplate) {
            <option value="@key" selected>@value</option>   
        } else {
            <option value="@key">@value</option>                            
        }
    }

</select>   

仍然想知道是否有更好的选择/方法。

【讨论】:

    【解决方案3】:

    实际上,有一个更好的解决方案。如果您调用具有部分绑定表单的模板,您将实现您的目标。这是您的控制器的代码:

    Ok(views.html.myForm(myForm.bind(
                 Map("fieldName1" -> "value1",
                     "fieldName2" -> "value2"))))
    

    确保将字段名映射到要预先选择的 options 中的 values。

    【讨论】:

      【解决方案4】:

      仍然想知道是否有更好的选择/方法。

      好吧,如果你不打算使用 play 来解决这个特定问题,你总是可以使用 JavaScript 和 jQuery 来解决它:

      $(function () {    
          $('#yourSelect_id').val(5);
      }
      

      您的选择选项每个都有值,而您希望预先选择的一个选项的值是 5。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多