Основная проблема заключается в том, что Grails автоматически экранирует значения в виде HTML при вставке на страницу GSP. Вы можете подавить это, добавив совет
<%@ expressionCodec="none" %>
в начале страницы GSP.
Имейте в виду, что ваше приложение будет менее защищенным после внесения изменений. Особенно, если данные могут содержать созданные пользователем данные, люди могут начать возиться с вашим приложением.
Вот пример использования Grails 3.3.8, основанный на тестовых данных, предоставленных @Kumar Chapagain, большое спасибо.
В контроллере вам не нужно упаковывать данные в ModelAndView, поскольку это делается автоматически Grails. Просто верните карту с необходимыми записями. Я предпочитаю преобразовывать карту в JSON в контроллере, а не на странице gsp, поскольку она сохраняет элемент управления, где она принадлежит, и GSP более простой.
Контроллер:
package g338
import grails.converters.JSON
class ChartController {
def index() {
Map userResultMap = [:]
List dateCreated = ["2018-09-17 13:07:06.0","2018-09-17 13:27:06.0","2018-09-17 14:27:06.0","2018-09-17 17:27:06.0"]
List result = [50, 56, 23, 42]
userResultMap.put("dateCreated",dateCreated)
userResultMap.put("result",result)
[ userResultMap: userResultMap as JSON ]
}
}
страница gsp: views / chart / index.gsp
<%@ expressionCodec="none" %>
<!doctype html>
<html>
<head>
<meta name="layout" content="main"/>
<title>Welcome to Grails</title>
</head>
<body>
<canvas id="myChart"></canvas>
<g:javascript>
var result = ${userResultMap};
var data = result.result;
var labels = result.dateCreated;
var config = {
type: 'line',
data: {
labels: labels,
datasets: [{
label: 'Clinical FRE',
backgroundColor: '#7A564A',
borderColor: '#7A564A',
data: result,
fill: false
}]
},
options: {
legend: {
display: false
},
tooltips: {
enabled: false
},
responsive: true,
scales: {
yAxes: [{
gridLines: {
drawBorder: false,
color: ['#9b1f22', '#9b1f22', '#ed1c24', '#ed1c24', '#f7931f', '#f7931f', '#206b36', '#206b36', '#206b36', '#206b36', '#206b36']
},
ticks: {
min: 0,
max: 100,
stepSize: 10,
callback: function (value) {
return value + "%"
}
}
}]
}
}
};
window.onload = function createChart(data) {
var ctx = document.getElementById('myChart').getContext('2d');
window.myLine = new Chart(ctx, config)
};
</g:javascript>
</body>
</html>