html - Django页面,刷新页面时丢失ChartJs渲染图
问题描述
我已经成功地在我的homepage
路径中渲染了图表,但是每当我刷新页面时,我都会丢失渲染的任何内容,而且我不是 100% 确定原因。
# urls.py
urlpatterns = [
path('', chartData.homepage, name='homepage'),
path('chart/', chartData.chart, name='chart'),
path('api/chart/data/', chartData.as_view()),
]
我不确定问题出在哪里,而且我对 Ajax 还很陌生,所以我相信我遗漏了一些东西。
<form autocomplete="off" action="" method="GET">
<div class="autocomplete">
<input id="myInput" type="text" name="Item" placeholder="Enter Item">
</div>
<input type="submit" id="submitBtn" value="Search">
</form>
<div class="chart-container">
<canvas id="myChart"></canvas>
</div>
<script type="text/javascript">
var endpoint = 'api/chart/data/'
var dataset = []
var labels = []
$('#submitBtn').click(function(e){
e.preventDefault();
var item = $('#myInput').val();
$('#myInput').val('');
window.history.pushState("object or string", "Title", "/?Item" + item);
$.ajax({
url: endpoint,
method: "GET",
dataType: "text",
success: function(){
$.ajax({
method: "GET",
url: endpoint,
data:{
'item': item,
},
success: function(data){
console.log(itemName)
labels = data.labels
dataset = data.dataset
var ctx = document.getElementById('myChart').getContext('2d')
var chart = new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [{
backgroundColor: 'rgb(255, 99, 132)',
borderColor: 'rgb(255, 99, 132)',
data: dataset,
fill: false,
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
}
})
},
error: function(error_data){
console.log("error")
console.log(error_data)
}
})
}
})
})
</script>
<!--JavaScript file for autofill functionality in search bar-->
<script src="static/javascript/autofill.js"></script>
<!--JavaScript at end of body for optimized loading-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
在框中键入“apples”会返回127.0.0.1:8000/?Item=apples
带有正确图表的 url,刷新会返回相同的 url 但没有任何渲染..?
更新 1
代码注释中的想法,不确定这是否是一个好方法?
<script type="text/javascript">
function createGraph(data, item){
labels = data.labels
dataset = data.dataset
var ctx = document.getElementById('myChart').getContext('2d')
var chart = new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [{
data: dataset,
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
title: { display: true, text: item, fontColor: '#000000', fontSize: 40},
}
})
}
var endpoint = 'api/chart/data/'
var dataset = []
var labels = []
$('#submitBtn').click(function(e){
e.preventDefault();
var itemName = $('#myInput').val();
$('#myInput').val('');
window.history.pushState("object or string", "Title", "/?Item=" + item);
$.ajax({
url: endpoint,
method: "GET",
dataType: "text",
success: function(){
$.ajax({
method: "GET",
url: endpoint,
data:{
'item': item,
},
success: function(data){
createGraph(data, item)
}
})
}
})
})
//checking if jquery string exists outside of function and ajax
//if exists, then you should run the ajax again alongside the createGraph function?
//refreshing page without any values does console.log('False')
//refreshing page with existing jquery string does console.log('Jquery string parameter exists...')
if(location.search){
var item = $('#myInput').val(location.search);
$('#myInput').val('');
console.log('Refreshing page, jquery string value = ' + item)
console.log('Jquery string parameter exists...')
}
else {
console.log('False')
}
</script>
更新 2
我能够按照@Ben 下面所说的来解决刷新问题。我检查了是否存在 Jquery 字符串,如果存在,则通过 Ajax 调用重新呈现图形。
if(location.search){
console.log('Jquery string exists...')
$('#myInput').val('Apples') //replace 'Apples' with var that gets
//jquery string
var item = $('#myInput').val();
console.log('Jquery string value = ' + item)
$('#myInput').val('');
var endpoint = 'api/chart/data/'
var dataset = []
var labels = []
$.ajax({
url: endpoint,
method: "GET",
dataType: "text",
success: function(){
$.ajax({
method: "GET",
url: endpoint,
data:{
'item': item,
},
success: function(data){
createGraph(data, item)
}
})
}
})
}
else{
console.log('False')
}
解决方案
由于 Submitting ,您会得到一个结果
$('#submitBtn').click( [...]
,正在下载的数据会触发图表的创建。
我建议将图表创建拉到它自己的函数中,然后在 api 返回数据成功时调用它,如果有可用参数,则在页面加载时调用它,即?Item=apples
<script type="text/javascript">
function createGraph(data) {
console.log(itemName)
labels = data.labels
dataset = data.dataset
var ctx = document.getElementById('myChart').getContext('2d')
var chart = new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [{
backgroundColor: 'rgb(255, 99, 132)',
borderColor: 'rgb(255, 99, 132)',
data: dataset,
fill: false,
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
}
})
};
var endpoint = 'api/chart/data/'
var dataset = []
var labels = []
$('#submitBtn').click(function(e){
e.preventDefault();
var item = $('#myInput').val();
$('#myInput').val('');
window.history.pushState("object or string", "Title", "/?Item" + item);
$.ajax({
url: endpoint,
method: "GET",
dataType: "text",
success: function(){
$.ajax({
method: "GET",
url: endpoint,
data:{
'item': item,
},
success: function(data){
createGraph(data);
[...]
}}}
推荐阅读
- ios - 更改图像视图后 UIImage 未更新
- javascript - Javascript将数组中的字符串拆分为数组中的对象
- ios - 如何使用目标 c/Swift 在本机 iOS 中禁用屏幕截图?
- node.js - 从nodejs中的回调函数返回值
- python - 用 sympy 求解线性方程组需要很长时间
- android - 华为 HMS - 使用自定义 uri 架构从浏览器打开应用程序
- html - 背景循环视频在手机上不起作用
- .net - 如何在 gRPC 上实现服务器“回调”
- sql - 如何在databricks sql中将字符串转换为日期
- sql - SQL 未从数据集中返回所需的 MAX 版本