2014-06-11 56 views
1

我有下列输入 “基团”:播放框架2字段分组

  • 文本输入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 
) 

但显然,这不是我想要的,因为它会总是需要文本2。有没有一种方法来实现这个相互依赖的验证?基于麦片建议

更新: 该解决方案的工作,但是它有一些怪癖,我需要克服:

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

我看着游戏支持的自定义验证器,但我看不到我如何使用它们在多个字段上操作。 The example they show仅适用于正在验证的表单字段,并没有明显的方式引用表单中的其他输入。

回答

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部分(因为他们推荐这是一条很好的路线)

+0

这一般起作用,但有几个问题:临时验证只发生在_所有其他非临时验证通过(所以我不会知道错误,除非一切正常)。此外,该验证不“适用于”特定领域,例如text2 - >换句话说,我希望能够在text2旁边的窗体上显示一个错误,但是这个错误似乎是一个表单级错误,而不是字段级。我怀疑也许一个自定义验证程序可以提供帮助,但我不明白我可以如何使用它们跨多个字段进行验证(自定义验证程序似乎只能在单个字段上运行)。 – oym

+0

@oym你可以将'validate'方法移动到'MyData'类本身,然后调用该谓词表达式作为验证器(如果有验证程序接受任意谓词)。 – wheaties

+0

你会介意扩展一下,也许举个例子?我不知道该如何开始:我该如何使用这种验证方法等。谢谢 – oym