【问题标题】:How do I invoke a template from another template in Play Framework?如何从 Play Framework 中的另一个模板调用模板?
【发布时间】:2013-03-25 04:23:00
【问题描述】:

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

【问题讨论】:

    标签: java html scala playframework playframework-2.0


    【解决方案1】:

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

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

    有状态的网络应用程序

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

    无状态网络应用程序

    在无状态 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)
        }
    

    【讨论】:

    • 如果我这样做,结果将是所有帐户的重复交易详细信息列表。我想要实现的是为用户提供两个单独的视图: 1. 帐户名称列表。 2. 给定账户的交易清单。我想从第一个视图创建链接,以便用户可以打开第二个视图,但我不希望仅仅为了显示事务而调用服务器。
    • 在这种情况下,您将不得不使用一些客户端模板和一些客户端库。看看淘汰赛
    • 糟糕,淘汰赛看起来很有趣,但我希望能够使用一些简单的 html、javascript 或播放框架模板来解决问题。你不知道任何聪明的快速方法吗?好像我有一个简单而普遍的需求,应该有一些简单的解决方案:)。
    • 抱歉不清楚。我并没有试图让服务器处理状态。我正在尝试使用“无状态网络应用程序”/“一次性生成用户界面”选项。我意识到一次加载所有数据的缺点,但此时优点超过了缺点。我有某种误解,希望我可以使用模板之间的链接来隐藏/显示部分。但是,我意识到我需要生成 javascript 或使用现有的 javascript(例如 twitter 引导选项卡)来完成此操作。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多