ser*_*ron 1 scala playframework playframework-2.2
我有以下模板代码:
意见/ Login.scala.html:
@(loginForm: Form[views.Data])
@import mytemplates.loginform
@Main("") {
email:@loginform(loginForm("email"))
@*email:@loginForm("email").value.getOrElse("xyz")*@
}
Run Code Online (Sandbox Code Playgroud)
意见/ mytemplates/loginform.scala.html:
@(emailField: Field)
@emailField.value.getOrElse("xyz")
Run Code Online (Sandbox Code Playgroud)
意见/ Main.scala.html:
@(page: String)(content: Html)
<!DOCTYPE html>
<html>
<body>
@content
</html>
Run Code Online (Sandbox Code Playgroud)
意见/ 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;
}
}
Run Code Online (Sandbox Code Playgroud)
编译上述内容是成功的.但是,如果线@*email:@loginForm("email").value.getOrElse("xyz")*@在Login.scala.html是注释掉编译产生的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 $
我不得不valueOr("")在Login.scala.html中使用,否则将生成NullPointer执行异常.显然,他们都是不同的阶级.我没有太多使用Play框架,我不确定这意味着什么.
由于看起来你有一个Java项目,所以框架将在Java类和它们的Scala等价物之间进行一些自动转换.
试试这个:
@loginForm("email").getClass()
@loginForm("email").value.getClass()
Run Code Online (Sandbox Code Playgroud)
就这两种变化Login.scala.html和loginform.scala.html,你会看到你正在处理中的每个场景中不同的班级.
当你浏览loginform模板时,你field.value将被包裹在一个scala.Some对象中,这就是为什么要.getOrElse编译的原因.当您在主视图中直接执行此操作时,您永远不会离开Java类世界,因此您field.value将直接返回为String.
如果您使用的是最新版本的Play,那么您应该能够使用该Field.valueOr方法而不是getOrElse.
@loginForm("email").valueOr("xyz")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2421 次 |
| 最近记录: |