我看到了一个登录表单,有一个name
输入有许多验证器:
object Users extends Controller {
val loginForm = Form(tuple(
"name" -> (
nonEmptyText // (1)
verifying ("Its length should >= 4", name=>{ println("#222");name.length>=4 }) // (2)
verifying ("It should have numbers and letters", name=>{println("#333"); ...}) // (3)
)
}
然后我不输入任何内容,按提交,我发现控制台打印:
#222
#333
这意味着所有验证器都已执行,并且它们之间存在关系:
(1) & (2) & (3)
但我希望他们:
(1) && (2) && (3)
这意味着,如果名称为空,则后面的两个验证器将被忽略。
play2里可以吗?
默认行为是应用字段上定义的所有约束。
但是,您可以定义自己的验证约束,在第一次失败时停止应用约束:
def stopOnFirstFail[T](constraints: Constraint[T]*) = Constraint { field: T =>
constraints.toList dropWhile (_(field) == Valid) match {
case Nil => Valid
case constraint :: _ => constraint(field)
}
}
它可以像下面这样使用:
val loginForm = Form(
"name" -> (text verifying stopOnFirstFail(
nonEmpty,
minLength(4)
))
)
scala> loginForm.bind(Map("name"->"")).errors
res2: Seq[play.api.data.FormError] = List(FormError(name,error.required,WrappedArray()))
scala> loginForm.bind(Map("name"->"foo")).errors
res3: Seq[play.api.data.FormError] = List(FormError(name,error.minLength,WrappedArray(4)))
scala> loginForm.bind(Map("name"->"foobar")).errors
res4: Seq[play.api.data.FormError] = List()
(请注意,我的实现stopOnFirstFail
应用失败约束的两倍,所以这个不应该有副作用)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)