programing

Play2 스칼라 템플릿에서 변수 선언

nasanasas 2020. 12. 29. 07:09
반응형

Play2 스칼라 템플릿에서 변수 선언


Play2 Scala 템플릿에서 로컬로 사용할 변수를 어떻게 선언하고 초기화합니까?

나는 이것을 가지고있다:

@var title : String = "Home"

템플릿 상단에 선언되었지만 다음과 같은 오류가 발생합니다.

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

@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그것은 다시 덮어 쓰려고 할 때만 관련 이 있지 않습니까?


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='LContent_div@i'>
                     ^
  <div id='inner_div_@k'></div>
                     ^
</div>

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..."));
}

@defining으로 모든 콘텐츠를 래핑하지 않으려면 다음을 수행 할 수 있습니다.

@yourVariable = { yourValue }

@defining 지시문은 템플릿에서 실제로 읽을 수 없습니다.


매우 깔끔해 보이고 가끔 선호되는 확실한 솔루션이 있습니다. 템플릿 주위에 범위를 정의하고 그 안에 변수를 정의한 다음 범위가 다음과 같이 필요한 html 코드를 생성하도록합니다.

@{
  val title = "Home"

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

여기에는 몇 가지 단점이 있습니다.

  • you are generating your html as Scala NodeSeq this way, which may be limiting sometimes
  • there is a performance issue with this solution: the code inside of @{ seems to be compiled runtime, because the Scala code generated for the page loooks like this (some usual Twirl stuff deleted):

The generated code:

...    

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>"""))
      }
    }
  }

...

In twirl templates I would recommend using the defining block, because the

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

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

would result in different values when used multiple times!

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

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

ReferenceURL : https://stackoverflow.com/questions/12031146/declare-variable-in-a-play2-scala-template

반응형