我有一个模板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
?我准备根据需要更改模板。
答案 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
属性“调用”/链接显示帐户交易的其他模板。但是,您可以执行以下任何操作:
<div>
部分。同时生成javascript以1)隐藏概述div
和2)在单击概述中的某个帐户时显示特定事务div
。请参阅Edmondo1984提出的淘汰库或twitter bootstrap中的手风琴或标签。href="@routes.Controllers.account(account.id)"
(请参阅Edmondo1984答案)并制作另一个模板以查看此数据。由于该问题涉及从服务器获取所有数据的情况,请转到选项1。