【问题标题】:Inserting Javascript Fragment Using Thymeleaf Includes Double Quotes使用 Thymeleaf 插入 Javascript 片段包括双引号
【发布时间】:2018-08-27 13:19:30
【问题描述】:

我正在尝试在 Thymeleaf 模板中动态创建 Javascript,以便使用 Google Chart 的 Timeline 包(注意 - 此包在 Google 库的 Spring 版本中不可用)。

我有一个带有以下代码的 Thymeleaf 片段 ganttchartvalue.html,然后将其包含到实际页面中:

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/

  google.charts.load('current', {'packages':['timeline']});
  google.charts.setOnLoadCallback(drawChart);
  function drawChart() {
    var container = document.getElementById('timeline');
    var chart = new google.visualization.Timeline(container);
    var dataTable = new google.visualization.DataTable();

    dataTable.addColumn({ type: 'string', id: 'Card' });
    dataTable.addColumn({ type: 'date', id: 'Start' });
    dataTable.addColumn({ type: 'date', id: 'End' });
    dataTable.addRows([ /*[[${Parms}]]*/ ]);

    chart.draw(dataTable);
  }

/*]]>*/
</script>

在我的 GanttController 类中,我有以下代码:

String Parms = "[ 'MegaCorp App 1', new Date(2018, 7, 2), new Date(2019, 4, 9) ]"; model.put("Parms", Parms);

(模型属于 Map 类型)。

这接近工作,但生成的输出(最终页面源)是:

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
/*<![CDATA[*/

  google.charts.load('current', {'packages':['timeline']});
  google.charts.setOnLoadCallback(drawChart);
  function drawChart() {
    var container = document.getElementById('timeline');
    var chart = new google.visualization.Timeline(container);
    var dataTable = new google.visualization.DataTable();

    dataTable.addColumn({ type: 'string', id: 'Card' });
    dataTable.addColumn({ type: 'date', id: 'Start' });
    dataTable.addColumn({ type: 'date', id: 'End' });
    dataTable.addRows([ "[ 'MegaCorp App 1', new Date(2018, 7, 2), new Date(2019, 4, 9) ]"]);

    chart.draw(dataTable);
  }

/*]]>*/
</script>

问题:

如何消除 dataTable.addRows 方法调用中插入文本前后的额外双引号 (") 以便此代码正常工作?

谢谢

【问题讨论】:

    标签: spring google-visualization thymeleaf


    【解决方案1】:

    Thymeleaf 并非设计用于这种方式。您不应该在模型中添加 JSON 字符串。相反,您应该做的是添加将以相同方式输出的 java 对象。在你的情况下:

    model.put("parms", new Object[] {new String[] {"MegaCorp App 1", "2018-07-02", "2018-04-09"}});
    

    然后在你的javascript中:

    <script type="text/javascript" th:inline="javascript">
    .
    .
    .
    var rows = /*[[${parms}]]*/ null;
    rows[0][1] = new Date(rows[0][1]);
    rows[0][2] = new Date(rows[0][2]);
    dataTable.addRows(rows);
    .
    .
    .
    </script>
    

    【讨论】:

    • 感谢银河战士!这可以正常工作。一个小的编辑 - 如果您使用时间线对象,则需要颠倒参数中日期的顺序,因为否则结束日期早于开始日期的包对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多