การตั้งค่าตัวแปร JavaScript จาก Spring model โดยใช้ Thymeleaf


114

ฉันใช้ Thymeleaf เป็นเครื่องมือแม่แบบ ฉันจะส่งตัวแปรจาก Spring model ไปยังตัวแปร 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>

คำตอบ:


192

ตามเอกสารอย่างเป็นทางการ:

<script th:inline="javascript">
/*<![CDATA[*/

    var message = /*[[${message}]]*/ 'default';
    console.log(message);

/*]]>*/
</script>

1
ไม่ทำงาน ... javascript error uncaught syntax error
szxnyc

6
ใช้งานได้ดีและสามารถอ่านได้จาก messages.properties: var msg = [[# {msg}]];
Andrey

2
@szxnyc ถ้าคุณลืม/*<![CDATA[*/มาโครคุณจะได้รับสิ่งนั้น
CodeMonkey

8
ให้ความสนใจด้วย<script th:inline="javascript">
Grigory Kislin

1
@ MichałStochmalคุณสามารถโหลดจาวาสคริปต์แบบอินไลน์ที่ด้านบนของจาวาสคริปต์ภายนอกและใช้ตัวแปรเดียวกัน (กำหนดในจาวาสคริปต์แบบอินไลน์) ในจาวาสคริปต์ภายนอก
Alfaz Jikani

20
var message =/*[[${message}]]*/ 'defaultanyvalue';

6
สังเกตว่าไม่ควรเว้นวรรคระหว่าง / * * / และ [[]] ที่มีอยู่
jyu

1
เป็นที่น่าสังเกตว่าdefaultanyvalueจะใช้เฉพาะเมื่อเรียกใช้เพจแบบคงที่นั่นคือภายนอกคอนเทนเนอร์ของเว็บ หากวิ่งภายในคอนเทนเนอร์และmessageยังไม่ได้ประกาศตัวแปรรหัสที่มาผลลัพธ์จะเป็นvar message = null;
Felipe Leão

3
สิ่งสำคัญคือต้องเพิ่มth:inline="javascript"แท็กสคริปต์
redent84

15

Thymeleaf 3 ตอนนี้:

  • แสดงค่าคงที่:

    <script th: inline = "javascript">
    var MY_URL = /*[${T(com.xyz.constants.Fruits).cheery}]]*/ "";
    </script>
    
  • แสดงตัวแปร:

    ข้อความ var = [[$ {message}]];
    
  • หรือในความคิดเห็นเพื่อให้มีรหัส JavaScript ที่ถูกต้องเมื่อคุณเปิดไฟล์เทมเพลตของคุณในลักษณะคงที่ (โดยไม่ต้องดำเนินการที่เซิร์ฟเวอร์)

    Thymeleaf เรียกสิ่งนี้ว่าเทมเพลตธรรมชาติของ JavaScript

    ข้อความ var = / * [[$ {message}]] * / "";
    

    Thymeleaf จะเพิกเฉยต่อทุกสิ่งที่เราเขียนหลังจากความคิดเห็นและก่อนอัฒภาค

ข้อมูลเพิ่มเติม: http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#javascript-inlining


ขอบคุณ! อยากจะให้เบียร์กับคุณฉันกำลังมองหาไวยากรณ์นี้ var MY_URL = /*[[${T(com.xyz.constants.Fruits).cheery}]]*/ "";
อ. อ

12

ตามเอกสารประกอบมีหลายวิธีในการทำซับใน
วิธีที่ถูกต้องคุณต้องเลือกตามสถานการณ์

1) เพียงแค่ใส่ตัวแปรจากเซิร์ฟเวอร์ไปยังจาวาสคริปต์:

<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>

สถานการณ์เดียวที่ฉันไม่สามารถแก้ไขได้ - จากนั้นฉันต้องส่งตัวแปร javascript ภายในวิธีการเรียก Java ภายในเทมเพลต (ฉันเดาไม่ได้)


9

ตรวจสอบให้แน่ใจว่าคุณมีไทม์ลีฟอยู่แล้ว

//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>


0

หากคุณต้องการแสดงตัวแปรของคุณโดยไม่ใช้ Escape ให้ใช้รูปแบบนี้:

<script th:inline="javascript">
/*<![CDATA[*/

    var message = /*[(${message})]*/ 'default';

/*]]>*/
</script>

สังเกต[(วงเล็บที่ห่อตัวแปร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.