2014-06-11 78 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