我正在尝试将一些代码从Play Framework Java移植到Play Framework Scala,但我在移植标记时遇到了一些问题。
Java版本中的标记检查Flash作用域的内容,并根据用户的值(错误,成功等)向用户创建通知。
我尝试创建Scala视图(flag.scala.html
):
@()(implicit flash:play.mvc.Scope.Flash)
@if(flash.get("error")) {
<p style="color:#c00">
@flash.get("error")
</p>
}
我从main.scala.html
拨打电话:
@views.Application.html.flag()
我得到的错误是:
文件{module:。} / tmp / generated / views.html.main.scala不可能 编译。引发的错误是:找不到隐含值 参数flash:play.mvc.Scope.Flash
对新标记的调用是正确的,就像我用浏览器中显示的某些String替换内容一样。
我确定这是愚蠢的,但我被卡住了。有什么建议吗?
答案 0 :(得分:5)
我不知道Play的细节,但是这个编译错误说你应该:
在play.mvc.Scope.Flash
的调用中传递flag()
的显式实例,
views.Application.html.flag()(myFlash)
或
在调用Flash
的范围内创建flag()
的隐式实例。您可以通过导入某个对象(import some.path.FlashImplicits._
)的内容或自己定义隐式实例来完成此操作,
implicit val myFlash: play.mvc.Scope.Flash = ...
...
views.Application.html.flag()
所以真正的问题就变成了:你想从哪里获得这个Flash
实例?
答案 1 :(得分:3)
您不应自行为“隐式flash:Flash”创建实现。只需在您的操作中添加“隐式请求”即可。
更多详情请见页面末尾:https://github.com/playframework/Play20/wiki/ScalaSessionFlash
答案 2 :(得分:1)
Ivan有正确的建议,加上“隐含请求”。但是,他的链接似乎已经过时了。如果您想要更明确的解释,请在此处查看我对类似问题的回答:
How to pass flash data from controller to view with Play! framework
答案 3 :(得分:0)
我有同样的问题,但查看文档后我发现了以下内容:
如果错误'找不到参数flash的隐含值: play.api.mvc.Flash'被提出然后这是因为你的Action没有 导入请求对象。添加“隐含请求=&gt;”
当然,如果你有嵌套的视图,隐式Flash必须出现在每个视图中:
@(implicit flash: Flash){
@main(){<h1>hello</h1>}
}
此视图不使用flash范围,但如果main使用它,则应使用main在视图中声明,因为编译器会抱怨。
来源:http://www.playframework.com/documentation/2.1.1/ScalaSessionFlash