Подтвердить что ты не робот

Объявить переменную в шаблоне Play2 scala

Как вы объявляете и инициализируете переменную, которая будет использоваться локально в шаблоне Play2 Scala?

У меня есть это:

@var title : String = "Home"

объявленный в верхней части шаблона, но он дает мне эту ошибку:

illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
4b9b3361

Ответ 1

@defining("foo") { title=>
  <div>@title</div>
  ...
}

в основном, вы должны обернуть блок, в котором вы собираетесь его использовать.

Ответ 2

На самом деле, решение @c4k работает (и довольно удобно), пока вы не пытаетесь изменить значение переменной после этого, не так ли?

Вы просто разместите это в верхней части шаблона:

@yourVariable = {yourValue}

или, если это более сложное выражение, вы делаете это:

@yourVariable = @{yourExpression}

Вы даже можете работать с такими вещами, как списки:

@(listFromController: List[MyObject])
@filteredList = @{listFromController.filter(_.color == "red")}

@for(myObject <- filteredList){ ... }

В данном примере это будет

@title = {Home}  //this should be at beginning of the template, right after passing in parameters

<h1> Using title @title </h1>

В комментариях, которые вы сказали, он вводится в тип HTML. Однако это актуально только в том случае, если вы снова попытаетесь перезаписать @title, не так ли?

Ответ 3

Scala шаблон поддерживает это, вы можете определить переменную в шаблоне

@import java.math.BigInteger; var i=1; var k=1

если вы хотите изменить его значение в шаблоне

@{k=2}

пример

@(title:String)(implicit session:play.api.mvc.Session)
@import java.math.BigInteger; var i=1; var k=1
^
<div id='[email protected]'>
                     ^
  <div id='[email protected]'></div>
                     ^
</div>

Ответ 4

virtualeyes - это правильное решение, но есть и другая возможность: вы можете просто объявить параметр вида, как обычно, значением по умолчанию, в таком случае вы получите его для всего шаблона +, вы сохраните возможность для меняя его с controller:

@(title: String = "Home page")

<h1>Welcome on @title</h1>

контроллер:

def index = Action{
    Ok(views.html.index("Other title"))
}

Обратите внимание, что Java-контроллер не распознает значения шаблонов по умолчанию, поэтому вам нужно добавлять их каждый раз:

public static Result index(){
    return ok(views.html.index.render("Some default value..."));
}

Ответ 5

Если вы не хотите обертывать весь свой контент с помощью @defining, вы можете сделать это:

@yourVariable = { yourValue }

Директива @defining действительно нечитаема в шаблоне...

Ответ 6

Существует одно очевидное решение, которое выглядит довольно чистым и может быть предпочтительным иногда: определить область вокруг шаблона, определить свою переменную внутри нее и позволить области создавать код html, который вам нужен, например:

@{
  val title = "Home"

  <h1>Welcome on {title}</h1>
}

Это имеет некоторые недостатки:

  • вы генерируете свой html как Scala NodeSeq таким образом, который иногда может быть ограниченным
  • в этом решении есть проблема с производительностью: код внутри @{, похоже, скомпилирован во время выполнения, потому что код Scala, сгенерированный для этой страницы, похож на этот (некоторые обычные вещи Twirl удалены):

Сгенерированный код:

...    

Seq[Any](format.raw/*1.1*/("""<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Basic Twirl</title>
    </head>
    <body>

        """),_display_(/*9.10*/{
            val title = "Home"

                <h1>Welcome on {title}</h1>
        }),format.raw/*15.10*/("""

    """),format.raw/*17.5*/("""</body>
</html>"""))
      }
    }
  }

...

Ответ 7

@isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}

Ответ 8

В шаблонах twirl я бы рекомендовал использовать определяющий блок, потому что

@random = @{
     new Random().nextInt
}

<div id="@random"></div>
<div id="@random"></div>

приведет к различным значениям при многократном использовании!

@defining(new Random().nextInt){ random =>
    <div id="@random"></div>
    <div id="@random"></div>
}