【问题标题】:Throw ajax error incase of custom exception using JSON object while populating datatable using datatables jquery plugin在使用数据表 jquery 插件填充数据表时使用 JSON 对象引发自定义异常时抛出 ajax 错误
【发布时间】:2013-06-06 16:50:11
【问题描述】:

我是 MVC 和 Jquery 的新手。我目前正在使用来自 jquery 的数据表插件来填充我的应用程序中的表。我的问题是当应用程序第一次加载时, sAjaxSource 用于指定从中加载数据的 url(返回 JSON 对象)。

我的问题是我在加载数据时几乎没有要捕获的自定义异常。但我不确定如何使用 JSON 将其作为错误传递,以及我们在客户端哪里捕获错误。在填充数据表时,我没有找到任何指定 ajax 调用成功或错误结果的选项。我的参考链接是http://www.datatables.net/ref#sDom

【问题讨论】:

  • 当你在 google 上搜索 DataTables warning: table id Ajax error 时有很多问题。这对于以自定义方式处理它有一个相当不错的答案。

标签: jquery json jquery-datatables


【解决方案1】:

看来您需要使用fnServerData 回调。我自己从未使用过它,但您似乎可以手动执行 ajax 请求并捕获您想要的任何服务器端错误。

在你的情况下,它会是这样的:

$(document).ready( function() {
    try {
        $('#example').dataTable( {
        "bProcessing": true,
        "bServerSide": true,
        "sAjaxSource": "xhr.php",
        "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
          oSettings.jqXHR = $.ajax( {

            "dataType": 'json', 

            "type": "POST", 

            "url": sSource, 

            "data": aoData, 

            "success": function(response) {
                 //do error checking here, maybe "throw new Error('Some error')" based on data;
                 fnCallback(arguments);
            },

            "error": function() { //404 errors and the like wil fall here
                //"throw new Error('Some error')"
            }
          } );
        }
        } );
    } catch (e) {
        console.error(e);
    }
} );

同样,我以前从未使用过该回调,但从参考资料来看,它似乎是正确的做法。

这是关于如何在客户端捕获错误的部分。至于发生错误时发送什么内容,取决于您的语言和框架。如果你的项目很重要,并且你做了很多这样的 ajax 请求,我建议你构建一个 REST API 来获取你的数据。

或者你可以在服务器端捕获你的错误并返回一个像这样的json:

{
   returnStatus: "error",
   message: "message"
}

当请求成功时,返回如下内容:

{
   returnStatus: "success",
   data: [...]
}

只需检查 ajax“成功”回调的 returnStatus。

【讨论】:

    【解决方案2】:

    Datatables 有一个"ajax" (reference) 选项。您可以将字符串、对象或函数传递给此选项。如果传入一个函数,则可以控制来自 AJAX 请求的“错误”响应。那么你就不必有丑陋的错误信息,“DataTables warning: table id Ajax error”

    而不是使用此选项构造数据表:

                ajax: {
                    url: uri,
                    dataSrc: "",
                },
    

    你可以用一个函数来做:

                /* Datatable options */
                ajax: function(data, callback, settings) {
                    datatableAjaxRequest(callback, uri);
                },
    
    /* later on... */
    var datatableAjaxRequest = function(callback, uri) {
        $.get(uri)
            .done(function(result) {
                /* result is an array, so I wrap it with an object with attribute "data". */
                callback({ data: result });
            })
            .fail(function(result) {
                console.log(result);
                $('#error-message').html("Could not load the table.");
                $('#error-modal').modal();
            });
    };
    

    您可以通过弄乱 uri 变量来强制执行 404 来轻松测试这一点。

    编辑:

    使用此选项会导致 datatable.ajax.url(newuri).load() 失败。它不再使用您的函数,而是再次调用内部方法。解决方法:调用datatable.ajax.reload() 并在datatableAjaxRequest 方法中设置/重置uri。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2016-06-19
      • 2015-02-08
      相关资源
      最近更新 更多