我的特点如下:
trait NewTrait {
def NewTrait(f: Request[AnyContent] => Result): Action[AnyContent] = {
Action { request =>
implicit val newTrait = new model.helper.newTrait
f(request)
}
}
}
使用该特征的控制器,并尝试将隐式val newTrait传递给视图:
object Test extends Controller with NewTrait {
def foo(num: Int) = NewTrait { request =>
val view = (views.html.example.partials.viewWrap)
Ok(views.html.example.examplePage(views.html.shelfPages.partials.sidebar())
}
在foo中,newTrait不在范围内,但是将其纳入范围的最佳做法是什么?它必须是每个收到的请求都是唯一的。如果我从foo中重新声明隐式val,它会工作,但我每次都必须在控制器中重复该声明,如果我可以将其隐藏在特征中,代码看起来会更清晰。是否有任何方法可以将特征中的隐含值传递给控制器?
答案 0 :(得分:0)
将上述val设为字段变量:
trait NewTrait {
implicit val newTrait = new model.helper.newTrait
...
}
现在它将在方法foo
范围内。
答案 1 :(得分:0)
虽然我发现这些名字有点令人困惑(可能是示例代码),但这是你可以做到的:
trait NewTrait {
def NewTrait(f: Request[AnyContent] => model.helper.newTrait => Result): Action[AnyContent] = {
Action { request =>
val newTrait = new model.helper.newTrait
f(request)(newTrait)
}
}
}
在使用它的代码中:
object Test extends Controller with NewTrait {
def foo(num: Int) = NewTrait { request => implicit newTrait =>
Ok
}
}
答案 2 :(得分:0)
你可以:
trait NewTrait {
def gotRequest(req:Request) = {
implicit val newTrait = new model.helper.newTrait
// don't have to pass the newTrait parameter here
// explicitly, it is used implicitly
Whatever.f(request)
}
}
和
object Whatever {
def f(req:Request)(implicit val newTrait:NewTrait) = {
//newTrait is in scope here.
//...the rest of your code
}
}