こんにちは。しーばです。みんな大好きThymeleafのお話です。
今日は気が向いたのでThymeleaf&JavaScriptね。
http://www.thymeleaf.org/doc/html/Using-Thymeleaf.html#script-inlining-javascript-and-dart
Natural Templating
Thymeleafはナチュラルテンプレーティングってのをコンセプトに持ってます。
静的に見ても動的に見てもちゃんと見れるってことね。こんな感じ。
<p>Today is: <span th:text="${today}">13 february 2011</span>.</p>
静的に見ると、 "th:"で始まる属性は「なにそれ?知らんわ!」ってスルーされるから、これと同じことになるね
<p>Today is: <span>13 february 2011</span>.</p>
動的に見ると、 "th:"で始まる属性がThymeleafに解釈されてこうなる
<p>Today is: <span>23 november 2013</span>.</p>
なにがいいかって。アプリを動かしてなくてもデザインがちゃんと見れるってことね。
Thymeleaf and JavaScript
その思想はJavascriptにも拡張されてて。インラインJavaScriptを次のように書けます。
<script th:inline="javascript"> /*<![CDATA[*/ ... var username = /*[[${session.user.name}]]*/ 'Sebastian'; ... /*]]>*/ </script>
静的にみると session.user.name はコメントなので、usernameは'Sebastian'になります。
Thymeleafで動かすと session.user.name の値が username に適用されます。こんな感じ。
キャー素敵!
<script th:inline="javascript"> /*<![CDATA[*/ ... var username = 'John Apricot'; ... /*]]>*/ </script>
オブジェクトを突っ込むときの注意点
JavaScriptでオブジェクトも突っ込んだれ!!と。
<script th:inline="javascript"> /*<![CDATA[*/ ... var user = /*[[${session.user}]]*/ null; ... /*]]>*/ </script>
で、Userクラスはこんな感じ。
public class User { public String name; public Integer age; }
アプリで動かしてみたら
<script th:inline="javascript"> /*<![CDATA[*/ ... var user = {}; ... /*]]>*/ </script>
(´・ω・`)ショボーン
よくよくドキュメントを読み直してみたら。
Note that this evaluation is intelligent and not limited to Strings. Thymeleaf will correctly write in Javascript/Dart syntax the following kinds of objects:
- Strings
- Numbers
- Booleans
- Arrays
- Collections
- Maps
- Beans (objects with getter and setter methods)
ん・・・。
Beans (objects with getter and setter methods)
まじか!ん。setter関係ねーよなー。とgetterをつけて。
public class User { public String name; public Integer age; public String getName() { return name; } public Integer getAge() { return age; } }
無事思ったとおりに動いてくれました!
<script th:inline="javascript"> /*<![CDATA[*/ ... var user = {"age":33,"name":"Mitsuyuki Shiiba"}; ... /*]]>*/ </script>
(∩´∀`)∩ワーイ
ThymeleafのJavaScriptに渡すためだけにgetterつけなきゃなのだけど。まいっか。
Listを渡したら配列にしてくれたりとか。結構便利だったりします。
じゃ、いまからスイートブールのミミの部分だけ食べようかな。