如何从Play Framework中的另一个模板调用模板?

时间:2013-04-03 13:17:13

标签: java html scala playframework playframework-2.0

我有一个模板accountlist.scala.html,如下所示:

@(accounts: models.domain.AccountList)
@titlebar = {<p>some html</p>}
@content = {
    @for(account <- accounts) {
        <p>@account.name</p>
    }
}

@main(titlebar)(content)

...和另一个模板account.scala.html是这样的:

@(account: models.domain.Account)

@titlebar = {<p>@account.name</p>}
@content = {
    @for(transaction <- account.getTransactions()) {
        <p>@transaction.detail</p>
    }
}
@main(titlebar)(content)

我从两个人那里调用模板main.scala.html

我可以在第一个视图accountlist.scala.html中访问整个Account POJO,所以当我去视图时,我无需调用服务器来获取帐户的详细信息我在其中显示详细信息。我想在客户端更改视图。如何从用户点击列表中的帐户的account.scala.html视图中调用第二个视图accountlist.scala.html?我准备根据需要更改模板。

2 个答案:

答案 0 :(得分:4)

我提供了之前的答案,在本文末尾仍然可以找到。从你的评论中,我知道你在不了解它有多危险的情况下要求其他东西。

处理您的用例有三种方法,让我们从最糟糕的方法开始。

有状态的网络应用

如果您已从某些数据源将数据加载到Pojo中,并且您希望在多个请求之间重用Pojo,那么您要做的是在服务器上实现某种客户端状态,例如缓存。 Web应用程序已经以这种方式开发了很长时间,这是主要错误和错误的根源。如果数据库中的基础帐户数据在一个http请求和以下之间更新,会发生什么?您的客户端将不会看到它,因为它使用缓存数据。此外,当用户在浏览器中执行后退时会发生什么?如何在服务器端收到通知,以便跟踪用户在导航流程中的位置?出于这些和其他原因,玩!被设计为无国籍如果你真的喜欢Web应用程序,你可能需要了解什么是REST架构风格。

无状态网络应用

在无状态Web应用程序中,不允许在两个http请求之间保留数据,因此您有两种方法来处理它:

一次性生成用户界面

这是您在减少帐户数据时可以使用的方法。您将每个帐户中的所有必要数据嵌入到您的页面中,然后生成视图,该视图会一直隐藏,只有在用户点击时才显示。请注意,您可以在服务器端生成HTML,并且Javascript只会使您的DOM的某些部分可见,或者只是转移您帐户的JSON表示并使用某种模板库直接在客户端上构建必要的UI < / p>

在需要时生成用户界面

当帐户数据结构包含太多信息时,此方法变得必要,并且您不希望首先在客户端上为所有帐户传输所有这些信息。例如,如果您知道用户只想看到极少数帐户的详细信息,那么您只想在用户要求时才需要详细信息。

例如,在您的帐户列表中,您将有一个与每个帐户关联的按钮,称为详细信息,您将使用帐户ID向服务器发送新请求。

@(accounts: models.domain.AccountList)
@titlebar = {<p>some html</p>}
@content = {
    @for(account <- accounts) {
        <p>@account.name <button class="details" href="@routes.Controllers.account(account.id)">details</button></p>
    }
}

请注意,您还可以在客户端生成用户界面,但是当用户单击按钮时,您仍需要从服务器检索数据结构。这将确保用户检索帐户的最后一个可用状态。


旧答案

如果你的目标是重用你的观点,Play视图就是Scala类,所以你可以导入它们:

@import packagename._

然后在另一个模板中使用它:

@for(account <- accounts) {
        @account(account)
    }

答案 1 :(得分:0)

该问题揭示了对游戏框架模板的误解。在编译play项目时,模板代码将转换为html,css和javascript。

您无法从帐户行的href属性“调用”/链接显示帐户交易的其他模板。但是,您可以执行以下任何操作:

  1. 如果您已将所有帐户中的所有交易一次性加载到客户端:扩展模板,为显示交易的每个帐户生成单独的<div>部分。同时生成javascript以1)隐藏概述div和2)在单击概述中的某个帐户时显示特定事务div。请参阅Edmondo1984提出的淘汰库或twitter bootstrap中的手风琴或标签。
  2. 如果您只从服务器加载帐户概述。生成一个这样的链接href="@routes.Controllers.account(account.id)"(请参阅Edmondo1984答案)并制作另一个模板以查看此数据。
  3. 由于该问题涉及从服务器获取所有数据的情况,请转到选项1。