【问题标题】:Variable in Play Framework 2.x TemplatePlay Framework 2.x 模板中的变量
【发布时间】:2017-03-21 04:58:04
【问题描述】:

我浏览了网页,但在任何地方都没有找到答案。如果我遗漏了什么,请指点我的教程。

所以我想在 Play Framework 模板中定义一个变量,当然,以后再使用它。

目前我的代码如下所示:

@if(menuitems.fetchFromVerySlowDatabase() != null) {
<ul>
    @for(menuitem <- menuitems.fetchFromVerySlowDatabase()) {
        <li><a href="@menuitem.getUrl()">menuitem.getTitle()</a></li>
    }
</ul>
}

我知道我可以缓存menuitems.fetchFromVerySlowDatabase,但我真正想要的是这样的:

@menuitems_from_database = menuitems.fetchFromVerySlowDatabase();
@if(menuitems_from_database != null) {
<ul>
    @for(menuitem <- menuitems_from_database) {
        <li><a href="@menuitem.getUrl()">menuitem.getTitle()</a></li>
    }
</ul>
}

谢谢!

我使用 Java 作为编程语言。

最好, 舒贝

【问题讨论】:

  • 我知道这并不能回答您的问题,但您可能应该在调用模板之前进行任何繁重的计算,并将结果作为参数传递,而不是在模板内执行操作,模板只能用于展示东西。
  • 我同意,但是:我需要每个页面上的菜单项,所以我在模板中获取它们,否则每个控制器中的每个操作都需要将菜单项传递给模板系统。或者至少,这是我的想法。你有更好的解决方案吗?谢谢!
  • 如果您在每个页面上都需要它们,您可能希望尽可能少地加载它们。根据它们的基础何时更新,您可能会考虑将它们作为一个值一次性加载到您的控制器中,或者使用某种缓存系统以避免在每个页面上获取它们,特别是如果,正如名称似乎表明的那样,该操作需要很长时间。然后,您可以创建一个将此值传递给模板调用程序的函数。
  • 是的,我正在尝试尽可能少地加载它。实际上,这几乎解决了(通过缓存)。但我真的想避免将菜单项作为参数单独传递给每个模板。
  • 关于菜单。有一个很好的描述stackoverflow.com/questions/9629250/…,我只能补充说你也可以添加缓存,play也有缓存API:playframework.com/documentation/2.5.x/JavaCache

标签: scala playframework-2.0 twirl


【解决方案1】:

只要记住一行就行了

@import scala.Predef; var menuitems_from_database = menuitems.fetchFromVerySlowDatabase();

实时代码示例(从默认模板修改index.scala.html):

@import scala.Predef; var menuitems_from_database = new java.util.ArrayList[String]()
@(message: String)

@{
  menuitems_from_database.add("1")
  menuitems_from_database.add("2")
  ""
}

@main("Welcome to Play") {
    @if(menuitems_from_database != null) {
            <ul>
                @for(menuitem <- menuitems_from_database) {
                    <li><a href="@menuitem">@menuitem</a></li>
                }
            </ul>
        }
}

生成的 HTML:

<!DOCTYPE html>
<html lang="en">
    <head>            
        <title>Welcome to Play</title>
        <link rel="stylesheet" media="screen" href="/assets/stylesheets/main.css">
        <link rel="shortcut icon" type="image/png" href="/assets/images/favicon.png">
        <script src="/assets/javascripts/hello.js" type="text/javascript"></script>
    </head>
    <body>
            <ul>
                    <li><a href="1">1</a></li>
                    <li><a href="2">2</a></li>
            </ul>
    </body>
</html>

【讨论】:

  • 谢谢你的回答,但我不明白。我将代码更改为: var menuitems_from_database = menuitems.fetchFromVerySlowDatabase() @if(menuitems_from_database != null) {
      @for(menuitem
  • 有效!谢谢!
  • 一个小注释:现在“true”被打印到分配变量的 HTML 中。
  • 因为每个语句都必须向模板返回一些内容,所以就像在我的示例中那样使用它,在我将元素添加到列表@{ ... ""} 的部分中,你返回一个空字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多