playのviewでローカル変数を宣言したり、それを使ったりのメモ書き。
(javaのクラスのstaticなメソッドとフィールドなら、直感的にできたんだけどね・・・)

こんな感じで変数を宣言して表示ができる。HogeBeanはサービス側のjava自作クラス

<div>
@{
val hogeval = "hoddfsfdsgehoge"
var hogeInt = 123
var hogeBean = new HogeBean
<div class="bar">
{hogeval}
{hogeInt}
</div>
}
</div>

これもできる。

<div>
@{
val hogeval = "hoddfsfdsgehoge"
var hogeInt = 123
var hogeBean = new HogeBean
<div class="bar">
{hogeval}
{hogeInt}
</div>
<div class="bar">
{hogeval}
{hogeInt}
</div>
}
</div>

途中で変数値を変更しようとすると、コンパイラエラーが出る「Overloaded method value [apply] cannot be applied to (Unit)」

<div>
@{
val hogeval = "hoddfsfdsgehoge"
var hogeInt = 123
var hogeBean = new HogeBean
<div class="bar">
{hogeval}
{hogeInt}
</div>
{ hogeInt = 23432 }
<div class="bar">
{hogeval}
{hogeInt}
</div>
}
</div>


あと、下だと「121」としか表示されない。一つ目の{no}は式として評価されているみたい。

@{
var no = 1

{no = no + 10}
{no}
{no = no + 10}
{no = no + 100}
{no}

}

下だと、Overloaded method errorが出る。

@{
var no = 1

{no = no + 10}
<div>{no}</div>
{no = no + 10}
{no = no + 100}
<div>{no}</div>

}

下だと、両方の{no}が表示されて「11」「121」。

@{
var no = 1

<div>{no = no + 10}</div>
<div>{no}</div>
<div>{no = no + 10}</div>
<div>{no = no + 100}</div>
<div>{no}</div>

}

よくわからん。もう少し調べないとだめだ。

さらに実験。今度はpage scope?の変数が欲しい。これは大丈夫。

@myTitle = @{ if(true) "true question" else "create question" }
@myTitle

<br/>

@myTitle2 = @{ "hoge edit question" }
@myTitle2

<br/>

@myTitle2

これは二つ目の@myTitle2=で、コンパイルエラーが出る。
method myTitle2 is defined twice conflicting symbols both originated
エラメを見ると、メソッドとして定義されているみたいだ。そして、二重定義はできないらしい。
@myTitle2で文字列を表示できるのは、メソッドの実装が"hoge edit question"を返すってことなのだろう。なるほど。

@myTitle = @{ if(true) "true question" else "create question" }
@myTitle

<br/>

@myTitle2 = @{ "hoge edit question" }
@myTitle2

<br/>

@myTitle2 = @{ "hoge edit question" }
@myTitle2

引数を伴う関数の定義と利用について。
@heading(title:String) = {
<div class="heading">
<h2>@title</h2>
</div>
}

@heading("Welcome3333333333339999999999999!")

なんかvalとvarはそれぞれ違うらしい。最初に書いた例でもvalとvarが混ざってた。varが変数でvalが定数らしい。valに再代入しようとするとreassignment to valっていうエラーがでる。紛らわしい。

う~ん、page scope の変数とか拡張for文のループ変数を使いたいだけなんだけど・・・


下みたいに書けば、拡張for文じゃなくてループ変数を作れる。けど、ループの中でオブジェクトを変数にセットして、その表示と取得がしたいんだけどわからん(hogeBeanはオブジェクト、hogeListはList)
@for(i <- 0 until hogeBean.hogeList.size) {

hoge / @{i+1}<br/>

@hogeBean.hogeList.get(i)
}

なんか、scalaの基本的な構文をはき違えている気がする。

scalaだとListにzipWithIndexを使えば、Listのオブジェクトとループ変数を同時に使えるらしい。下みたいな感じ。

@for((mdo, index) <- hogeBean.hogeList.zipWithIndex) {
<tr>
<td>@{index+1}</td>
<td>@mdo.hogeField</td>
</tr>
}

できたのはいいけど、ますます訳がわからなくなった。何度も言うけど、ページスコープの変数を使いたいだけなんだけど・・・scala勉強しよう、便利そうだから。

[追記]
@for( i <- 1 to 9; j <- 1 to 9 ) {
@(i * j)
@Html( if( j == 9 ) "<br>" else "" )
}
参考:play2.0(scala)を導入してみる