4

デフォルトでは、この関数はで機能し$_GETます。この議論に基づいて、私はこの関数を変更し、以下のようなものを得ました。問題は、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;
    }
}

私は何が欠けていますか?なにか提案を?

4

1 に答える 1

2

jsonfnDataTablesPipeline()からプロパティを取得しますが、がtrueのoCache.lastJson場合に限ります。bNeedServer

fnDataTablesPipeline()呼び出されたことがないか、呼び出されたbNeedServerがfalseのままである場合、その行は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たとえば、。で始まる2行だけを抑制することが適切な場合がありますjson.aaData.splice...

于 2012-05-13T22:58:59.263 に答える