2016-12-26 16 views
1

我使用Elm表https://github.com/etaque/elm-form,但我无法弄清楚两个字段的验证,我想验证密码和密码确认字段是否匹配。验证Elm和Elm-Form中的两个字段

这是我到目前为止有:

validate : Validation String RegUser 
validate = 
    map6 RegUser 
     (field "email" email) 
     (field "password" (string |> andThen nonEmpty)) 
     (field "passwordConfirmation" (string |> andThen nonEmpty)) 
     (field "firstName" (string |> defaultValue "")) 
     (field "lastName" (string |> defaultValue "")) 
     (field "companyName" (string |> defaultValue "")) 

整个代码:https://github.com/werner/madison-elm/blob/master/src/elm/Components/Register/Models.elm

感谢您的帮助。

回答

0

的解决方案是接近于由乍得提供的一个,基于https://github.com/etaque/elm-form/issues/75#issuecomment-269861043

validate : Validation TranslationId RegUser 
validate = 
    map6 RegUser 
     (field "email" email) 
     (field "password" (string |> andThen nonEmpty)) 
     ((field "password" string) |> andThen validateConfirmation) 
     (field "firstName" (string |> defaultValue "")) 
     (field "lastName" (string |> defaultValue "")) 
     (field "companyName" (string |> defaultValue "")) 

validateConfirmation : String -> Validation TranslationId String 
validateConfirmation password = 
    field "passwordConfirmation" 
     (string 
      |> andThen 
       (\confirmation -> 
        if password == confirmation then 
         succeed confirmation 
        else 
         fail (customError PasswordNotMatch) 
       ) 
     ) 
2

你看到暴露andThensucceedfail功能包的任何时间,这是一个很好的迹象,你可以在“剥开”的值进行检查,并将其值与其他功能结合。在这种情况下,我们可以使用andThen两次,以建立该内部的两个命名字段,并检查偷窥验证功能,它们匹配:

matchingFields : String -> String -> Validation String String 
matchingFields masterField confirmField = 
    field masterField string 
     |> andThen (\masterVal -> field confirmField string 
     |> andThen (\confirmVal -> 
      if masterVal == confirmVal then 
       succeed masterVal 
      else 
       fail (customError "Values do not match"))) 

然后,您可以用它在你的整体验证函数是这样的:

validate : Validation String RegUser 
validate = 
    map6 RegUser 
     (field "email" email) 
     (matchingFields "password" "passwordConfirmation" |> andThen nonEmpty) 
     (field "passwordConfirmation" (string |> andThen nonEmpty)) 
     ...