Play Framework 2.1模板上的动态路由

4
以Java计算机数据库示例为起点,在Play!2.1中,我正在开发大约20个模型的CRUD管理后端。 我面临的问题是模板层次结构中同一功能的重复出现。
我尝试将链接函数重构为:
@****************************************
* Helper generating navigation links    *
****************************************@
@link(newPage:Int, newSortBy:String) = @{
    // Generate the link
    controllers.admin.routes.Model.index(newPage, "id", newSortBy)
}

将其转化为类似于以下内容

@(controller: Any, newPage: Int, newSortBy: String)
any.index(newPage, "id", newSortBy)

由于反向路由不继承任何特定类,所以我不能通过通用方式实现。之前的代码也不起作用,因为我没有进行类型转换(我猜测是因为编译器错误是“值索引不是 Any 的成员”)。
在运行时,有没有一种方法可以获取定义路由的列表?无论是在 Scala 模板还是在 Java 方面都可以,这样我就可以传递控制器名称并获取正确的反向路由来创建 URL。
如果不可能实现,那么重构所有重复模板代码的正确方法是什么,特别是那些依赖于 ReverseRouters 的模板。
1个回答

4
我还没有找到一种方法来动态获取路由器和反向路由器的列表,但我已经找到了一种方法来限制样板代码的数量,并能够将模板函数重构到它们自己的文件中,使代码更易于管理。
我发现Scala并不仅仅是另一种说Java的方式!具体来说,您可以将函数作为参数传递给函数(http://oldfashionedsoftware.com/2008/08/23/fun-with-scala-functions/),因此您可以将要在子模板中执行的代码传递给主模板(有点像DI)。
在我发布的示例中,问题是从主模板向子模板传递反向控制器,但“反向控制器”没有扩展任何特定对象。示例中的代码是:

template.scala.html

...
...
@****************************************
* Helper generating navigation links    *
****************************************@
@link(newPage:Int, newSortBy:String) = @{
    // Generate the link
    controllers.admin.routes.MyController.index(newPage, "id", "asc")
}
...
...
@**********************************
* Helper generating table headers *
***********************************@
@header(key:String, title:String) = {
    <th class="">
        <a href="@link(0, key)">@title</a>
    </th>
}
...
...

为了将 header 函数重构到自己的模板中,我必须能够调用 link 函数。使用从重构文件中包含的内容不起作用,因为反向控制器在 link 函数中是硬编码的。解决方案是将 header 函数提取到子模板中,并定义模板参数为函数:

views/utils/header.scala.html

@(key: String, title:String, link: (Int) => Html)
    <th class="@key">
        <a href="@link(0)">@title</a>
    </th>

现在在模板中:

views/admin/template.scala.html

...
@import utils._
...
@link(newPage:Int) = {
    @controllers.admin.routes.MyController.index(newPage, "id", "asc")
}
...
@header("key", "title", link _)
...

现在,我只需要为每个主要模板定义link函数,并将其作为参数传递给任何需要它的子模板即可。虽然不完全干净,但可以大大减少样板文件并简化模板更改。
希望对其他人有所帮助。还有更好的解决方案吗?

链接后面的下划线代表什么? - nbz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接