Web2py ajax函数即使在注释掉或未调用时也会抛出索引错误

时间:2014-12-23 00:23:05

标签: jquery ajax comments web2py indexoutofboundsexception

我正在尝试使用可能为空的数组/列表作为查询字符串来调用内置的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,表示包含注释掉的文本的代码块从未在第一时间执行。

有什么方法可以解决这个问题或阻止此错误触发?

1 个答案:

答案 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]}}';