【问题标题】:Play Framework 2 field groupingPlay Framework 2 字段分组
【发布时间】:2014-06-12 02:58:28
【问题描述】:

我有以下输入的“组”:

  • 文字输入1
  • 文字输入2
  • 复选框

始终需要文本输入 1。仅当检查复选框时才需要文本输入2。如何通过游戏实现这种类型的验证?目前我有这样的事情:

val myForm: Form[MyData] = Form(
  mapping(
    "text1" -> text.verifying("Text1 is required", !_isEmpty),
    "text2" -> text.verifying("Text2 is required", !_isEmpty),
    "check" -> boolean
)

但显然这不是我想要的,因为它总是需要 text2。有没有办法组合它来实现这种相互依赖的验证?

根据小麦的建议更新: 这个解决方案有效,但是它有一些我需要克服的怪癖:

  1. 在表单中的所有其他约束都通过之前,不会发生临时验证。如果其他约束失败,则临时验证甚至不会执行。我需要它们一起执行,以便我可以在表单上显示所有错误消息。
  2. 在此临时验证期间分配的错误不适用于特定的表单输入,例如文本2。在我的模板中,我需要在 text2 上显示一条错误消息,例如(“由于您选中了复选框,因此您需要填写此输入”)。相反,该错误只是一般的“表单级”错误。你可以想象我会有多个这种类型的验证实例,所以我可以假设这个错误适用于 text2。

我查看了 play 支持的自定义验证器,但不知道如何使用它们跨多个字段进行操作。 The example they show 仅应用正在验证的表单字段,没有明显的方式来引用表单中的其他输入。

【问题讨论】:

    标签: scala playframework-2.2


    【解决方案1】:

    您可以从文档中看到它们允许对您创建的表单对象进行临时验证(请参阅documents。)您可以做一个验证器:

     def validate(text1: String, text2: String, check: Boolean) = if(check) text2.nonEmpty else true
    
     val myForm: Form[MyData](
       mapping("text1" -> text.verifying("Text1 is required", !_isEmpty))
     )(MyData.unapply)(MyData.apply) verifying ("Text2 is required if check box checked", {
       case data => validate(data.text2, data.check)
     })
    

    这应该可以满足您的需求,但我也会查看他们的 custom validators 部分(因为他们推荐这是一条不错的路线。)

    【讨论】:

    • 这通常有效,但有几个问题:临时验证仅发生在 所有其他非临时验证通过之后(所以我不知道除非一切正常,否则错误)。此外,此验证不会“应用于”特定字段,例如text2 -> 换句话说,我希望能够在 text2 旁边的表单上显示错误,但这个错误似乎是表单级别的错误,而不是字段级别的错误。我怀疑自定义验证器可能会有所帮助,但我看不出如何使用它们跨多个字段进行验证(自定义验证器似乎只在单个字段上运行)。
    • @oym 您可以将 validate 方法移动到 MyData 类本身,然后调用该谓词表达式作为验证器(如果存在接受任意谓词的验证器。)
    • 您是否介意对此进行扩展,也许可以举个例子?我不知道如何开始:如何使用此验证方法等。谢谢
    • 我使用嵌套映射和您建议应用于嵌套映射的临时验证来实现它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2013-06-27
    相关资源
    最近更新 更多