如何将可重用代码从Play Framework模板移动到单独的模板(Scala)?

时间:2015-07-30 06:50:33

标签: scala templates playframework-2.0

我在模板中有这个可重复使用的代码,它运行正常。

@headers(page: String,site:Site, user: User) = @{
    page match {
        case "home" => Map(
            "title" -> "Welcome",
            "description" -> "Welcome to our site")
        case "profile" => Map(
            "title" -> user.name + "-" site.name,
            "description" -> "Hello" + user.name)
    }
}

现在我想将它移到单独的模板并将其包含在主模板中。 如果我把它放在像这样的单独文件中

@(page: String,site:Site, user: User) = page match {
        case "home" => Map(
            "title" -> "Welcome",
            "description" -> "Welcome to our site")
        case "profile" => Map(
            "title" -> user.name + "-" site.name,
            "description" -> "Hello" + user.name)
    }

当我尝试从主模板

中获取数据时
@templates.layout_headers("home", user, site)("title") I've got error
  

不接受参数   抱怨

("title")

一部分。如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的模板不接受title参数。您可以将旋转模板视为普通的scala函数。包含签名layout_header.scala.html的名为@(page: String, site:Site, user: User)的模板等同于

def layout_header(page: String, site: Site, user: User): play.twirl.api.HtmlFormat.Appendable

现在你试图将这个函数称为layout_headers(user, site)("title"),这显然是错误的,因为有两点。首先缺少参数page。其次,该函数不接受title参数。

由于您未在title中使用layout_headers,只需将其从通话中删除并添加page参数:

@templates.layout_headers(page, user, site)

如果模板中需要title,请将其添加到签名中:

@(page: String, site:Site, user: User, title: String) = page match {
  ...
}

然后将被称为

@templates.layout_headers(page, user, site, "Some title")