Объявить переменную в шаблоне 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"
7   51  

7 ответов:

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

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

на самом деле, решение @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 опять же, не так ли?

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

@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>

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

@(title: String = "Home page")

<h1>Welcome on @title</h1>

Если вы не хотите, чтобы обернуть все содержимое с @defining, вы можете сделать это:

@yourVariable = { yourValue }

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

есть одно очевидное решение, которое выглядит довольно чистым и иногда может быть предпочтительным: определите область вокруг шаблона, определите свою переменную внутри него, и пусть область создает необходимый вам 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>"""))
      }
    }
  }

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