2013-09-10 80 views
0

试图在非常有用的“可移植”jscript库中实现一些服务器端错误检查输入。jQuery ajax返回意外数据类型

以下调用的伟大工程:

jQuery.ajax({ 
    url: "index.php?option=com_catalogscontroller=batchsave", 
    data: {"formData": querydata.getData().splice(0, 1) }, 
    dataType: 'JSON', 
type: 'POST', 
    success: function (response) { 
    if(response.success) { 
    } else { 
    querydata.loadData(response.data); 
    } 
} 
}); 

我想到了就去做错误检查是最有效的方法是在服务器(PHP)侧,创建一个多维数组来跟踪服务器发现的任何错误,然后用相同的ajax调用中的表单数据返回该数组。所以我修改了服务器代码,将表单数据和错误数组返回给javascript ajax调用。即:

if(!empty($errors)) // $errors is an multi dimensional array same size as the form data 
    $result['success'] = false; 
    $result['msg'] = 'There were errors detected'; 
    $result['data']['form'] = $formData; 
    $result['data']['errors'] = $errors; 
} 
echo json_encode($result); 

,然后在客户端中,JavaScript例程上述已被修改为:

jQuery.ajax({ 
    url: "index.php?option=com_catalogscontroller=batchsave", 
    data: {"formData": querydata.getData().splice(0, 1) }, 
    dataType: 'JSON', 
    type: 'POST', 
    success: function (response) { 
    if(response.success) { 
    } else { 
      formErrors = response.data.errors; // formErrors is a global 
    querydata.loadData(response.data.form); 
    } 
} 
}); 

形式的原始功能被保留(表格数据被检索并在正确插入HTML),但formErrors返回给我的结果是莫名其妙。转让后,立即提醒“警报(formErrors)”显示类似的列表:

true,true,false,true,true 

,我如能也警告在一个特定的指标没有问题alert(formErrors [0] [2]);会显示'假'。但在ajax调用之外,该数组似乎无法访问,导致“未定义”错误。并且在ajax调用和ajax调用alert(typeof formErrors)之外的例程中都显示'object'并且alert(formErrors)提供了与上面相同的逗号列表,但我不想要一个对象,我期待数组或者只要我可以通过索引访问它,我就会对一个对象感到满意。我在这里错过了什么?

+0

看看会发生什么,如果你使用formErrors = JSON.stringify(response.data.errors);然后alert(formErrors); –

+0

该警报给出了用方括号括起来的相同的逗号分隔字符串,即[true,true,false,true,true] – hugo

+0

服务器端的'$ errors'的内容是什么?另外,我建议在调试像这样的情况下使用'console.log'或'debugger'。 – pdoherty926

回答

1

我遇到的问题似乎是围绕着JSONing。

大多数文档在支持Javascript AJAX调用的PHP例程中标识对JSON变量的需求。 jQuery.ajax调用的使用缓解了一些需求,但是如果你不知道自己在做什么(像我一样),它很容易陷入困境。

我的PHP程序编码JSON用下面的语句完整的响应记录:

return json_encode($result); 

因为我的:在jQuery.ajax()调用

dataType: JSON 

参数,这导致在自动json.parse()由PHP例程返回给jQuery javascript函数的结果。这是不成功的,因为服务器代码中的php json_encode调用不是递归的,所以当解码结果数组时,结果中的任何数组都不是。

解决方案然后是json对多维数组的组件进行编码,然后在客户端解码它们。例如

if(!empty($errors)) 
    $result['success'] = false; 
    $result['msg'] = 'There were errors detected'; 
    $result['data']['form'] = json_encode($formData); 
    $result['data']['errors'] = json_encode($errors); 
} 
echo json_encode($result); 

然后在客户端,解析(解码)这些数组明确:

jQuery.ajax({ 
    url: "index.php?option=com_catalogscontroller=batchsave", 
    data: {"formData": querydata.getData().splice(0, 1) }, 
    dataType: 'JSON', 
    type: 'POST', 
    success: function (response) { 
     if(response.success) { 
     } else { 
      formErrors = JSON.parse(response.data.errors); // formErrors is a global 
      querydata.loadData(JSON.parse(response.data.form)); 
     } 
    } 
}); 

我坦白承认,我真的不知道我在做什么,但上述构成的代码似乎对我开发解释它的逻辑有意义,它对我有用。不管怎样,再次感谢Nathan和pdoherty926。