必须刷新数据而不重新加载页面。最初的数据出现在jinja2的html上。
@app.route('/personal_account', methods=['POST'])
def welcome():
login = request.form['login']
data = get_default_user_data(login)
# ... processing
return render_sidebar_template("personal_account.html", data=data)
根据这些数据,图表是用chartist.js构建的。
personal_account.html
<div id="data">
<ul id="consumed_values">
{% set count = 0 %}
{% for i in data.consumed_values %}
<li>{{ data.consumed_values[count] }}</li>
{% set count = count + 1 %}
{% endfor %}
</ul>
</div>
<canvas width="800" height="600" id="canvas"></canvas>
<button id="button">Update</button>
我需要更新数据。我正在使用ajax。函数“request”在Python中向服务器发出post函数get_selected_values的请求。此功能提供新数据。但新的数据不会显示在页面上的jinja2中。数据仍然很旧。
personal_account.js
window.onload = draw();
function draw() {
var consumed_values = document.querySelectorAll('ul#consumed_values li');
var values = new Array();
for (var i = 0; i < consumed_values.length; i++) {
console.log(consumed_values[i].innerHTML);
values[i] = consumed_values[i].innerHTML;
}
var numbers = new Array();
for(var i=0; i<consumed_values.length; i++)
{
numbers[i]=i+1;
console.log(numbers[i]);
}
var ctx = document.getElementById('canvas').getContext('2d');
var grapf = {
labels : numbers,
datasets : [
{
strokeColor : "#6181B4",
data : values
}
]
}
new Chart(ctx).Line(grapf);
}
document.getElementById('button').onclick=function () {
request();
}
function reques() {
var first = selected[0];
var second = selected[1];
first.month = first.month+1;
second.month = second.month+1;
$.ajax({
type: 'POST',
url: '/get_selected_values',
success: function(response) {
alert('Ok');
draw();
},
error: function() {
alert('Error');
}
});
}
函数get_selected_values()
@app.route('/get_selected_values', methods=['POST'])
def get_selected_values():
# ...
data = fetch_selected_date(start_date=start_date, end_date=end_date, login=current_user.get_id())
if data:
# return jsonify({'result': True, 'data': data}) # does not work this way
# return jsonify({'result': False, 'data': []})
return render_sidebar_template("personal_account.html", data=data, result=1)
如何成功进行数据更新和图形重建?
编辑1
我正在使用get_selected_values函数的第一个版本。
请求函数如下所示:
...
success: function(response) {
alert('Успешно получен ответ:!'+ response.data);
document.getElementById('consumed_values').innerHTML = response.data;
draw();
},
...
数据正在成功更新,但图表看起来相同。怎么修?
好的,这是我对此的看法。您处于正确的轨道上,有一种方法可以更新元素,而无需在此实例中重新绘制页面。发生的事情是你从get_selected_values()
方法返回数据,但是一旦返回到你的AJAX请求就没有做任何事情。
首先,我要提请你注意你的AJAX请求:
$.ajax({
type: 'POST',
url: '/get_selected_values',
success: function(response) {
alert('Ok');
draw();
},
error: function() {
alert('Error');
}
});
当你从中获得成功的回复时,你会在UI中看到“OK”警告,对吧?但是,尽管你调用draw()
方法,UI中没有任何更新?
在这种情况下,您不希望从Flask函数返回render_template
。您已经在正确的轨道上从您的函数返回JSON:
if data:
# return jsonify({'result': True, 'data': data}) # does not work this way
当您返回JSON数据时,它将存储在response
函数中的success
变量中。如果你不确定那个response
变量究竟是什么,那么在你的AJAX请求的alert(JSON.stringify(response))
函数中用success
输出它的内容。从这里,您将看到您的数据返回到您的方法。
现在,您需要决定如何使用该数据更新UI中的<div id="data">
元素。您可以使用带有一系列document.getElementById('element_id').innerHTML
语句的JavaScript或类似方式来执行此操作,以便使用响应中的所有更新数据填充元素。
这将自动更新您希望显示的数据,而无需刷新页面。
既然你已经这样做了,再次调用你的draw()
函数,它现在应该使用更新的数据。
我希望这有助于让你走上正确的道路!
编辑后1
当你最初填充<div id="data">
时,你正在使用一个循环来填充元素中的一系列<li>
标签。
当您使用新数据更新此元素时,您只是使用.innerHTML
重新填充父<ul>
元素。
您的draw()
方法正在查找存储在<li>
元素中的数据。
您是否确定在执行更新后,您的<div id="data">
元素与您的draw()
方法完全相同(即预期)格式?因为它仍然在结构中:
<div id="data">
<ul id="consumed_values">
<li>Your updated data here...</li>
<li>More updated data...</li>
</ul>
</div>
这是你的draw()
方法期望找到的元素结构。它从列表中的每个<li>
元素中提取数据。所以这些是需要存储更新值的元素。