我有以下模板代码:
视图/ Login.scala.html:
@(loginForm: Form[views.Data])
@import mytemplates.loginform
@Main("") {
email:@loginform(loginForm("email"))
@*email:@loginForm("email").value.getOrElse("xyz")*@
}
视图/ mytemplates / loginform.scala.html:
@(emailField: Field)
@emailField.value.getOrElse("xyz")
视图/ Main.scala.html:
@(page: String)(content: Html)
<!DOCTYPE html>
<html>
<body>
@content
</html>
视图/ Data.java:
package views;
import play.data.validation.ValidationError;
import java.util.List;
public class Data {
public String email = "";
public Data() { }
public List<ValidationError> validate() {
return null;
}
}
编译以上内容是成功的。但是,如果 Login.scala.html 中的行@*email:@loginForm("email").value.getOrElse("xyz")*@
未注释,则编译会产生value getOrElse is not a member of String
错误。
为什么会这样?我希望排除模板mytemplates.loginform
,但无法使其发挥作用。
编辑:根据estmatic的建议,我得到以下内容:
视图/ Login.scala.html:
@loginForm("email").getClass
:class play.data.Form $ Field
@loginForm("email").valueOr("").getClass
:class java.lang.String
视图/ mytemplates / loginform.scala.html:
@emailField.getClass
:class play.core.j.PlayMagicForJava $$ anon $ 1
@emailField.value.getClass
:class scala.None $
我必须在 Login.scala.html 中使用valueOr("")
否则会产生NullPointer执行异常。显然,他们都是不同的阶级。我还没有使用Play框架,我不确定这意味着什么。
答案 0 :(得分:5)
由于看起来你有一个Java项目,所以框架将在Java类和它们的Scala等价物之间进行一些自动转换。
试试这个:
@loginForm("email").getClass()
@loginForm("email").value.getClass()
对Login.scala.html
和loginform.scala.html
进行此更改,您将看到您正在处理每个方案中的不同类。
当您浏览loginform
模板时,field.value
将被包装在scala.Some
对象中,这就是.getOrElse
在这种情况下编译的原因。如果直接在主视图中执行此操作,则永远不会离开Java类世界,因此field.value
将直接作为String
返回。
如果您使用的是最新版本的Play,那么您应该可以使用Field.valueOr
方法而不是getOrElse
。
@loginForm("email").valueOr("xyz")