我正在尝试从Controller传递数据以使用ChartJS来提供图表,但是当我使用keySet函数作为标签时,图表无法呈现。
这是来自控制器的方法:
@GetMapping("/reports") public String showDashboard(Model model) { Map<String, Integer> data = new LinkedHashMap<String, Integer>(); data.put("JAVA", 50); data.put("Ruby", 20); data.put("Python", 30); model.addAttribute("data", data); return "reports"; }
这是HTML代码:
<pre> <body> <div class="container"> <div th:replace="fragments/navbar :: top"></div> <div class="row" style="margin-top: 60px"> <div class="chart-container" style="margin: 0 auto; height:20vh; width:40vw"> <canvas id="myChart"></canvas> </div> <script> var ctx = document.getElementById('myChart').getContext('2d'); var myChart = new Chart(ctx, { type: 'pie', data: { labels: [[${data.keySet()}]], datasets: [{ data: [[${data.values()}]], backgroundColor: [ 'rgb(0,255,255)', 'rgb(46,139,87)', 'rgb(255,165,0)' ], borderColor: [ 'rgb(0,255,255)', 'rgb(46,139,87)', 'rgb(255,165,0)' ], borderWidth: 1 }] }, }); </script> </div> </div> </body> </pre>
该图表未呈现,这是我检查源代码时的输出:
<pre> <script> var ctx = document.getElementById('myChart').getContext('2d'); var myChart = new Chart(ctx, { type: 'pie', data: { labels: [JAVA, Ruby, Python], datasets: [{ data: [50, 20, 30], backgroundColor: [ 'rgb(0,255,255)', 'rgb(46,139,87)', 'rgb(255,165,0)' ], borderColor: [ 'rgb(0,255,255)', 'rgb(46,139,87)', 'rgb(255,165,0)' ], borderWidth: 1 }] }, }); </script> </pre>
似乎函数keySet()不能以String形式获取值。
如何调整它以将值显示为String,然后呈现为Labels?
问候,
我遇到了类似的问题,发现我们应该使用Object.keys(data)而不是data.keySet()。所以下面是您使用它的方式
Object.keys(data)
data.keySet()
var htmldata = [[${data}]]; var ctx = document.getElementById('myChart').getContext('2d'); var myChart = new Chart(ctx, { type: 'pie', data: { labels: Object.keys(htmldata), datasets: [{ data: Object.keys(htmldata).map(function(key) {return htmldata[key];}), backgroundColor: [ 'rgb(0,255,255)', 'rgb(46,139,87)', 'rgb(255,165,0)' ], borderColor: [ 'rgb(0,255,255)', 'rgb(46,139,87)', 'rgb(255,165,0)' ], borderWidth: 1 }] }, });
另外,您的Javascript不是百里香可读的。请在脚本标记中添加th:inline = javascript并提供以下CDATA
<script th:inline="javascript"> /*<![CDATA[*/ // Here goes my previous script /*]]>*/ </script>