如何在web2py中无刷新获取服务器更新数据
我在一个web2py应用中做了搜索框功能,可以从数据库中获取结果。不过,如果在页面打开的时候数据库的内容发生了变化,就需要重新加载页面才能看到更新后的内容。
我想知道怎么能在不重新加载页面的情况下,通过ajax或json等方式,把数据库的内容读到javascript变量里。
目前我使用了一个控制器,代码如下:
def testDB():
valA=[]
valB=[]
valC=[]
for x in db().select(db.products.ALL):
valA.append(x.prdA)
valB.append(x.prdB)
valC.append(x.prdC)
return dict(VA=valA, VB=valB, VC=valC)
然后在视图中这样获取数据:
{{valA=VA}} {{valB=VB}} {{valC=VC}}
A = {{=XML(response.json(valA))}}
B = {{=XML(response.json(valB))}}
C = {{=XML(response.json(valC))}}
这样可以使用变量。这个方法在页面加载时获取的数据是没问题的,但如果数据库有变化,就不会自动更新。为了获取新的数据,我尝试了:
function loadFromDB(){
jQuery.ajax({
type:"POST",
url:'testDB',
success: function(msg){
{{
valA=VA
valB=VB
valC=VC
}}
A = {{=XML(response.json(valA))}}
B = {{=XML(response.json(valB))}}
C = {{=XML(response.json(valC))}}
},
error: function(errormessage){alert("Error in retrieving from database");}
});}
但是这似乎还是在使用旧的VA/B/C变量,因为它没有反映数据库的任何变化。我还尝试了其他一些方法,比如在{{}}括号外使用A=VA,但还没有找到有效的解决方案。我应该怎么把python函数返回的数据获取到javascript中呢?
谢谢
1 个回答
0
假设你的 loadFromDB
函数是在 testDB
这个视图里定义的,那么在 loadFromDB
中的 {{ }}
里的内容会在调用 testDB
时,页面最初创建的时候就被填充好。web2py 的模板代码并不是在用户的浏览器里执行的,而是在服务器上生成初始的 Javascript(也就是页面最开始加载的时候)。
如果你想让 loadFromDb
对 Ajax 调用返回的数据进行处理,你就需要用 Javascript 来写逻辑。需要注意的是,jQuery.ajax 的 success
函数会把返回的数据作为第一个参数传入,所以可以这样写:
jQuery.ajax({
[snip]
success: function(data) {
[JS code to do something with the returned data]
},
etc.