テンプレートエンジンとしてThymeleafを使用しています。 SpringモデルからJavaScript変数に変数を渡す方法は?
春側:
@RequestMapping(value = "message", method = RequestMethod.GET)
public String messages(Model model) {
model.addAttribute("message", "hello");
return "index";
}
クライアント側:
<script>
....
var m = ${message}; // not working
alert(m);
...
</script>
公式によるとドキュメント:
<script th:inline="javascript">
/*<![CDATA[*/
var message = /*[[${message}]]*/ 'default';
console.log(message);
/*]]>*/
</script>
var message =/*[[${message}]]*/ 'defaultanyvalue';
Thymeleaf 3の現在:
定数を表示する:
<script th:inline = "javascript"> var MY_URL = /*[[${T(com.xyz.constants.Fruits).cheery}]]*/ ""; </ script>
変数を表示する:
var message = [[$ {message}]];
または、テンプレートファイルを静的な方法で(サーバーで実行せずに)開いたときに、有効なJavaScriptコードを含めるコメント内。
Thymeleafはこれを呼び出します:JavaScriptの自然なテンプレート
var message =/* [[$ {message}]] */"";
Thymeleafは、コメントの後、セミコロンの前に記述したすべてを無視します。
詳細: http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#javascript-inlining
すでにページにthymeleafがあることを確認してください
//Use this in Java
@Controller
@RequestMapping("/showingTymleafTextInJavaScript")
public String thankYou(Model model){
model.addAttribute("showTextFromJavaController","dummy text");
return "showingTymleafTextInJavaScript";
}
//thymleaf page javascript page
<script>
var showtext = "[[${showTextFromJavaController}]]";
console.log(showtext);
</script>
ドキュメントによる によると、インライン化を行う方法はいくつかあります。
状況に応じて選択する正しい方法。
1)サーバーからjavascriptに変数を配置するだけです:
<script th:inline="javascript">
/*<![CDATA[*/
var message = [[${message}]];
alert(message);
/*]]>*/
</script>
2)javascript変数とサーバー側変数を組み合わせます。 javascript内でリクエストするためのリンクを作成する必要があります。
<script th:inline="javascript">
/*<![CDATA[*/
function sampleGetByJquery(v) {
/*[+
var url = [[@{/my/get/url(var1=${#httpServletRequest.getParameter('var1')})}]]
+ "&var2="+v;
+]*/
$("#myPanel").load(url, function() {});
}
/*]]>*/
</script>
解決できない1つの状況-次に、テンプレート内で呼び出すJavaメソッド内でjavascript変数を渡す必要があります(それは不可能だと思う)。
私はこの種のものが野生で機能するのを見ました:
<input type="button" th:onclick="'javascript:getContactId(\'' + ${contact.id} + '\');'" />