【问题标题】:Server-side processing with pipelining使用流水线的服务器端处理
【发布时间】:2012-05-10 20:58:43
【问题描述】:

默认情况下,此函数适用于$_GET。基于on this discussion 我修改了this function 并得到了类似下面的内容。现在的问题是,Firebug 给出了错误信息

json.aaData 在第 99 行未定义

这是行(位于代码末尾):

json.aaData.splice( 0, iRequestStart-oCache.iCacheLower ); 

PHP 端做出响应,并且该表在没有流水线的情况下 100% 工作。但是当我启用流水线时会出现此错误:

http://screencast.com/t/GOJzPHq3kg

function fnDataTablesPipeline ( sSource, aoData, fnCallback ) {
    var iPipe = 5; /* Ajust the pipe size */

    var bNeedServer = false;
    var sEcho = fnGetKey(aoData, "sEcho");
    var iRequestStart = fnGetKey(aoData, "iDisplayStart");
    var iRequestLength = fnGetKey(aoData, "iDisplayLength");
    var iRequestEnd = iRequestStart + iRequestLength;
    oCache.iDisplayStart = iRequestStart;

    /* outside pipeline? */
    if ( oCache.iCacheLower < 0 || iRequestStart < oCache.iCacheLower || iRequestEnd > oCache.iCacheUpper )
    {
        bNeedServer = true;
    }

    /* sorting etc changed? */
    if ( oCache.lastRequest && !bNeedServer )
    {
        for( var i=0, iLen=aoData.length ; i<iLen ; i++ )
        {
            if ( aoData[i].name != "iDisplayStart" && aoData[i].name != "iDisplayLength" && aoData[i].name != "sEcho" )
            {
                if ( aoData[i].value != oCache.lastRequest[i].value )
                {
                    bNeedServer = true;
                    break;
                }
            }
        }
    }

    /* Store the request for checking next time around */
    oCache.lastRequest = aoData.slice();

    if ( bNeedServer )
    {
        if ( iRequestStart < oCache.iCacheLower )
        {
            iRequestStart = iRequestStart - (iRequestLength*(iPipe-1));
            if ( iRequestStart < 0 )
            {
                iRequestStart = 0;
            }
        }

        oCache.iCacheLower = iRequestStart;
        oCache.iCacheUpper = iRequestStart + (iRequestLength * iPipe);
        oCache.iDisplayLength = fnGetKey( aoData, "iDisplayLength" );
        fnSetKey( aoData, "iDisplayStart", iRequestStart );
        fnSetKey( aoData, "iDisplayLength", iRequestLength*iPipe );

        jQuery.post( sSource, aoData, function (data) { 
            /* Callback processing */
            oCache.lastJson = jQuery.extend(true, {}, data);

            if ( oCache.iCacheLower != oCache.iDisplayStart )
            {
                data.aaData.splice( 0, oCache.iDisplayStart-oCache.iCacheLower );
            }
            data.aaData.splice( oCache.iDisplayLength, data.aaData.length );

            fnCallback(data)
        },"json" );
    }
    else
    {
        json = jQuery.extend(true, {}, oCache.lastJson);
        json.sEcho = sEcho; /* Update the echo for each response */
        json.aaData.splice( 0, iRequestStart-oCache.iCacheLower ); // <- this line
        json.aaData.splice( iRequestLength, json.aaData.length );
        fnCallback(json);
        return;
    }
}

我错过了什么?有什么建议吗?

【问题讨论】:

    标签: javascript jquery ajax datatables pipeline


    【解决方案1】:

    jsonfnDataTablesPipeline() 中从oCache.lastJson 获取其属性,但前提是bNeedServer 为真。

    如果fnDataTablesPipeline() 从未被调用过或已被调用过但bNeedServer 仍然为假,那么oCache.lastJson = jQuery.extend(true, {}, data); 行将不会被执行并且json.aaData.splice() 将失败。

    您需要处理oCache.lastJson 未填充(或仅部分填充)的情况:

    • 通过使用默认属性初始化oCache.lastJson
    • 通过在尝试使用属性之前测试属性的存在并采取相应措施,

    例如:

    else{
        if(oCache.lastJson.aaData) {
            json = jQuery.extend(true, {}, oCache.lastJson);
            json.sEcho = sEcho; /* Update the echo for each response */
            json.aaData.splice( 0, iRequestStart-oCache.iCacheLower );
            json.aaData.splice( iRequestLength, json.aaData.length );
            fnCallback(json);
        }
    }
    

    我无法判断这是否 100% 正确。您可能需要在 if 子句中添加 less,例如,仅取消以 json.aaData.splice... 开头的两行可能是合适的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-04
      • 2013-07-10
      • 1970-01-01
      • 2011-09-25
      • 2019-07-20
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多