Переменная в шаблоне Play Framework 2.x

Я просмотрел Интернет, но нигде не нашел ответа. Если я что-то пропустил, пожалуйста, укажите мне на учебник.

Итак, я хочу определить переменную в шаблоне 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 как язык программирования.

Лучший, шубе


person schube    schedule 20.03.2017    source источник
comment
Я знаю, что это не отвечает на ваш вопрос, но вам, вероятно, следует выполнить какие-либо тяжелые вычисления перед вызовом вашего шаблона и передать результат в качестве параметра вместо того, чтобы делать что-то внутри шаблона, который следует использовать только для показа вещей.   -  person Cyrille Corpet    schedule 20.03.2017
comment
Я согласен, но: мне нужны пункты меню на каждой странице, поэтому я получаю их в шаблоне, иначе каждое действие в каждом контроллере должно было бы передавать пункты меню в систему шаблонов. По крайней мере, я так думаю. У вас есть лучшее решение? Спасибо!   -  person schube    schedule 21.03.2017
comment
Если они нужны вам на каждой странице, вы можете загружать их как можно меньше раз. В зависимости от того, когда их база обновляется, вы можете подумать о загрузке их один раз и навсегда как значения в вашем контроллере или с помощью какой-либо системы кэширования, чтобы избежать их выборки на каждой странице, особенно если, как видно из названия, действие требует долго. Затем вы можете создать функцию, которая передает это значение вызывающему шаблону.   -  person Cyrille Corpet    schedule 21.03.2017
comment
Да, я пытаюсь загрузить его как можно меньше раз. Собственно, это почти решаемо (с кешированием). Но я действительно хочу избежать передачи пунктов меню в качестве параметра каждому шаблону отдельно.   -  person schube    schedule 21.03.2017
comment
О меню. Существует хорошее описание stackoverflow.com/questions/9629250/, я могу добавить только то, что вы также можете добавить кеш, у игры также есть API кеша: playframework.com/documentation/2.5.x/JavaCache   -  person Andriy Kuba    schedule 21.03.2017


Ответы (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>
person Andriy Kuba    schedule 20.03.2017
comment
Спасибо за ответ, но я не понимаю. Я изменил код на: var menuitems_from_database = menuitems.fetchFromVerySlowDatabase() @if(menuitems_from_database != null) { ‹ul› @for(menuitem ‹- menuitems_from_database) { ...... и некоторые варианты с @var... и так далее, но ничего не компилируется. Не могли бы вы предоставить еще несколько строк кода. Спасибо! - person schube; 20.03.2017
comment
Работает! Спасибо! - person schube; 21.03.2017
comment
Один небольшой комментарий: теперь true печатается в HTML, где присваивается переменная. - person schube; 21.03.2017
comment
потому что каждый оператор должен что-то возвращать в шаблон, поэтому просто используйте его, как в моем примере, в той части, где я добавляю элементы в список @{ ... ""}, чтобы вы возвращали пустую строку - person Andriy Kuba; 21.03.2017