PlayFramework 2.0 - 无法从其他模板调用函数

时间:2012-11-05 20:41:57

标签: templates scala playframework playframework-2.0

我想在另一个文件中放置一些辅助函数,因为它们会被过度重用。我拿了Computer-Databse样本的列表文件:

https://github.com/playframework/Play20/blob/master/samples/scala/computer-database/app/views/list.scala.html

我在app / views包下创建了一个名为“listing.scala.html”的新文件,并将@link函数从原始文件移到了它。这个新文件如下所示:

@(currentSortBy: String, currentOrder: String, currentFilter: String)

@****************************************
* Helper generating navigation links    *
****************************************@
@link(newPage:Int, newSortBy:String) = @{

    var sortBy = currentSortBy
    var order = currentOrder

    if(newSortBy != null) {
        sortBy = newSortBy
        if(currentSortBy == newSortBy) {
            if(currentOrder == "asc") {
                order = "desc"
            } else {
                order = "asc"
            }
        } else {
            order = "asc"
        }
    }

    // Generate the link
    routes.Application.listPerfil(newPage, sortBy, order, currentFilter)

}

所以,在我的原始文件中,我用这个替换了@link调用:

<a href="@listing(currentSortBy, currentOrder, currentFilter).link(0, key)">@title</a>

问题是,当我尝试编译时,我得到了这个错误:

value link is not a member of play.api.templates.Html

但是根据文档(http://www.playframework.org/documentation/2.0.4/ScalaTemplateUseCases),似乎没问题。

有什么猜测吗?

1 个答案:

答案 0 :(得分:1)

Play的模板不是放置高级条件的最佳位置,很可能通过在某些控制器(或其他方法)中处理它会获得更好的灵活性,这将只返回您所需的链接

即:

 <a href="@controllers.Application.link(currentSortBy, currentOrder, currentFilter, 0, key)">@title</a>

在您的情况下,link(...) Application函数的A函数也可以返回反向路径。

请记住,包含其他模板是重复HTML块的最佳选择,但有时很难获得指定的字符串(主要是因为没有修剪空格)。如您所见,调用嵌套函数也存在问题。很可能你可以在listing.scala.html中生成整个{{1}}标签但是使用它不够舒服(恕我直言)。