我正在尝试使用可能为空的数组/列表作为查询字符串来调用内置的web2py ajax()函数。但是,当列表为空时,ajax会触发“列表索引超出范围”错误,尽管我事先检查了列表的长度,甚至在我评论ajax调用时也会发生这种情况。这是一个简单的例子。
在控制器中,default.py
:
def commenttest():
emptyList = []
return dict(list=emptyList)
def ajaxtest():
return ''
在视图中,commenttest.html
:
<script type="text/javascript">
$( document ).ready(function() {
console.log(parseInt({{=len(list)}}, 10));
if ((parseInt({{=len(list)}}, 10)) > 0){
console.log('List not empty');
var firstListElement = list[0];
//ajax('{{=URL('default', 'ajaxtest', vars={'actId':list[0]})}}', [], ':eval');
} else {
console.log('List empty');
}
});
</script>
问题在于//ajax('{{=URL('default', 'ajaxtest', vars={'actId':list[0]})}}', [], ':eval');
行。请注意,它根据Javascript语法进行了注释。删除此行后,程序运行正常,控制台输出0
后跟List empty
,表示包含注释掉的文本的代码块从未在第一时间执行。
有什么方法可以解决这个问题或阻止此错误触发?
答案 0 :(得分:0)
在web2py视图文件中,{{...}}
分隔符之间的任何代码都被解释为Python代码,并在将HTML返回到浏览器之前在服务器上执行。有问题的代码vars={'actId':list[0]}
是Python代码,因此如果Python列表为空,list[0]
将生成异常。 Javascript被注释掉并不重要,因为Python代码在浏览器接收或执行Javascript之前在服务器上执行。
似乎还有另一个问题:
var firstListElement = list[0];
以上是Javascript代码,但{J}代码中尚未定义list
变量(它只是一个Python变量,只能在视图中的任何Python代码中使用)。那么,那一行应该是:
var firstListElement = {{=list[0]}};
或者如果列表包含字符串:
var firstListElement = '{{=list[0]}}';