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 的代码。

4

1 回答 1

4

我还没有找到动态获取路由器和反向路由器列表的方法,但是我找到了一种方法来限制样板代码的数量并能够将模板函数重构为自己的文件,从而使代码更易于管理.

我发现 Scala 并不是 Java 的另一种说法!!!具体来说,您可以将函数作为参数传递给函数(http://oldfashionedsoftware.com/2008/08/23/fun-with-scala-functions/),因此您可以传递一段代码以在子模板上执行来自主模板(DI 类型)。

在我发布的示例中,问题是将反向控制器从主模板传递给子模板,但“反向控制器”不扩展任何特定对象。示例中的代码是:

模板.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函数提取到子模板中,并将模板的参数定义为函数:

意见/实用程序/header.scala.html

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

现在在模板中:

意见/管理/模板.scala.html

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

现在,我只需link为每个主模板定义函数,并将其作为参数传递给任何需要它的子模板。不完全干净,但减少了很多样板并简化了模板更改。

希望它可以帮助别人。更好的解决方案有人吗?

于 2013-04-08T22:20:13.810 回答