Playframework 将通用视图模板作为函数参数传递
我有一些控制器函数,它们使用不同的视图模板进行渲染。但是,控制器函数中的代码非常相似,需要重构为一个公共函数。所以,我需要这样的东西:Playframework 将通用视图模板作为函数参数传递,playframework,playframework-2.0,Playframework,Playframework 2.0,我有一些控制器函数,它们使用不同的视图模板进行渲染。但是,控制器函数中的代码非常相似,需要重构为一个公共函数。所以,我需要这样的东西: def controller1() = Action { // call some controller1-specific logic here refactoredFunc(views.html.view1) } def controller2() = Action { // call some controller2-specific log
def controller1() = Action {
// call some controller1-specific logic here
refactoredFunc(views.html.view1)
}
def controller2() = Action {
// call some controller2-specific logic here
refactoredFunc(views.html.view2)
}
def refactoredFunc(view: play.api.templates.Html) = {
// some common logic here
Ok(view)
}
上面的方法很有效(至少可以编译),但我不高兴指定refacturedfunc
只接受Html
模板作为输入,因为这是一个不需要的人工约束
我尝试用play.api.templates.BufferedContent[\u]
替换play.api.templates.Html
,但编译器不喜欢这样
那么,有没有一种通用的方法可以在不强制要求视图为Html的情况下执行此操作?您可能需要在RefacturedFunc中引入一个类型参数。由于Play使用mecanism发送响应,您还需要声明一个隐式的
可写的参数
def refactoredFunc[C](view: C)(implicit writeable: Writeable[C]) = {
Ok(view)
}
使用此代码,您可以使用任何类型的C
调用refacturedfunc
,该类型的Writeable[C]
隐式可用。Play将自动为其常见用例定义这些隐式,如Html
,…谢谢!虽然这不是我需要的确切解决方案(我过度简化了我的问题描述-视图也包含参数),但它确实为我指明了正确的方向: