我有一个模板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
。
我可以在第一个 View accountlist.scala.html中访问整个Account
POJO,所以我真的不需要在访问时调用服务器来获取帐户的详细信息到我显示详细信息的 View 。我只是想改变客户端的 View 。如何从用户点击列表中帐户的 View accountlist.scala.html
调用第二个 View account.scala.html
?我已准备好根据需要更改模板。
最佳答案
我已经提供了之前的答案,该答案在本文末尾仍然可用。然而,从您的评论中,我了解到您在要求其他东西,而不了解它有多么危险。
可以通过三种方式处理您的用例,让我们从最糟糕的一种开始。
有状态的 Web 应用程序
如果您已从某个数据源将数据加载到 Pojo 中,并且希望在多个请求之间重用 Pojo,那么您要做的就是在服务器上实现某种客户端状态,例如缓存。 Web 应用程序已经以这种方式开发了很长时间,这也是主要 bug 和错误的根源。如果数据库中的基础帐户数据在一个 http 请求和后续请求之间更新,会发生什么情况?您的客户端不会看到它,因为它使用缓存的数据。此外,当用户在浏览器中执行返回时会发生什么?如何在服务器端收到通知,以便跟踪用户在导航流程中的位置?出于这些和其他原因,玩吧!被设计为无状态。 如果您真的热衷于 Web 应用程序,您可能需要了解什么是 REST 架构风格。
无状态 Web 应用程序
在无状态 Web 应用程序中,不允许在两个 http 请求之间保留数据,因此有两种方法来处理它:
一次生成用户界面
这是减少帐户数据时可以使用的方法。您将每个帐户的所有必要数据嵌入到您的页面中,并生成 View ,该 View 保持隐藏,仅在用户单击时显示。请注意,您可以在服务器端生成 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>
}
}
请注意,您还可以在客户端生成用户界面,但当用户单击按钮时,您仍然需要从服务器检索数据结构。这将确保用户检索帐户的最后可用状态。
旧答案
如果您的目标是重用 View ,那么 Play View 就是 Scala 类,因此您可以导入它们:
@import packagename._
然后在另一个模板中使用它:
@for(account <- accounts) {
@account(account)
}
关于java - 如何从 Play Framework 中的另一个模板调用一个模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15788426/