2

我是 Play Framework 的新手,并且仍在尝试使用新的 Scala 模板引擎来解决一些问题。

假设我有以下包结构:

app/
app/controllers/Items.scala
app/models/Item.scala
app/views/layouts/page.scala.html
app/views/item/show.scala.html
app/views/item/details.scala.html  //partial

这是我的项目/展示模板:

    @(item: Item, form: Form[Item])(implicit flash: Flash)
    @layout.page() {
        @*want to include details partial, wont work due to item param*@
        @item.details(item)
    }

由于包含另一个模板(例如,包括上面的项目/详细信息)与访问模板参数(例如上面的项目)的语法完全相同,显然这种现有的命名约定在不进行更改的情况下将无法正常工作。

我知道我可以将我的“app.views.item”包重命名为“app.views.items”,并依靠单数/复数形式来区分视图和参数名称,但这似乎不是一个非常简单的解决方案。另外,如果我真的希望参数名称与视图包相同怎么办?

我的一个想法是在我所有的观点之前加上一个额外的顶级包:

 app/views/views/item/details.scala.html

所以包含语法是@views.item.details(),但这显然是一个hack。

避免这个问题的好方法是什么?如何更好地组织代码以避免此类命名冲突?

大多数其他模板引擎使用诸如“包含”或“渲染”之类的操作来指定部分包含。我不想在这里冒犯任何人,但 Play Scala 模板引擎语法是否如此简洁以至于它实际上决定了代码的组织?

4

1 回答 1

1

3个解决方案:

第一的

通常,您应该按照文档中的说明使用部分模板tags其中文件app/views/tags夹是基础:

文件:app/views/tags/product.scala.html

在模板中(父视图完整语法中不需要初始导入将允许您避免名称冲突:)@tags.packageName.tagName()

<div id="container">
    @tags.product(item)
</div>

当然,在您的情况下,您也可以使用基本文件夹中的包

文件:app/views/tags/item/product.scala.html

<div id="container">
    @tags.item.product(item)
</div>

我很确定这会解决你的问题。

第二

为了避免在不更改包名称的情况下发生冲突,您可以item在视图中重命名,另外我建议不要form为 Form[T] 使用名称,因为它可能与助手冲突:

@(existingItem: Item, existingItemForm: Form[Item])(implicit flash: Flash)
@layout.page() {
    @item.details(existingItem)
}

第三

如果您Form[Item]在传递给给定Item对象的视图之前填充您的内容,则不需要同时传递两者,因为您很可能可以从表单中获取数据:

@(itemForm: Form[Item])(implicit flash: Flash)
@layout.page() {
    <div>Name of item is: @itemForm("name").value (this is a replacemnet for @@existingItem.name </div>
    @item.details(itemForm)
}

当然,在您的 product.scala.html 中,您需要将@(item: Item)参数更改为@(itemForm: Form[Item])

于 2012-10-20T15:18:37.463 回答