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)を導入してみる
(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)を導入してみる