2

我有一个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 中访问整个AccountPOJO,所以当我转到显示详细信息的视图时,我真的不需要调用服务器来获取帐户的详细信息。我只想更改客户端的视图。如何account.scala.htmlaccountlist.scala.html用户单击列表中的帐户的视图中调用第二个视图?我已准备好根据需要更改模板。

4

2 回答 2

4

我已经提供了一个先前的答案,在这篇文章的末尾仍然可以找到。但是,从您的评论中,我了解到您在要求其他东西而不了解它的危险性。

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

有状态的 Web 应用程序

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

无状态的 Web 应用程序

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

一次性生成用户界面

当您的帐户数据减少时,您可以使用这种方法。您将每个帐户中的所有必要数据嵌入到您的页面中,并生成视图,您将其隐藏并且仅在用户单击时显示。请注意,您可以在服务器端生成 HTML,并使用 Javascript 使您的 DOM 的某些部分可见,或者只是传输您帐户的 JSON 表示并使用某种模板库直接在客户端上构建必要的 UI

需要时生成用户界面

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

例如,在您的帐户列表中,您将有一个与每个帐户关联的按钮,称为详细信息,您将使用帐户 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)
    }
于 2013-04-03T13:27:54.127 回答
0

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

您不能“调用”/链接另一个模板,显示来自href您帐户行属性的帐户交易。但是,您可以执行以下任何操作:

  1. 如果您已一次性将所有账户的所有交易加载到客户端:扩展模板以生成<div>显示交易的每个账户的单独部分。还生成 javascript 以 1) 隐藏概览和 2)在单击概览中的一个帐户时div显示特定交易。div请参阅 Edmondo1984 提出的淘汰库或 twitter bootstrap 中的手风琴或标签。
  2. 如果您只从服务器加载帐户概览。生成这样的链接href="@routes.Controllers.account(account.id)"(参见 Edmondo1984 答案)并制作另一个模板来查看此数据。

由于问题涉及您从服务器获取所有数据的情况,请选择选项 1。

于 2013-04-08T06:12:34.440 回答