2012-05-10 3 views
4

기본적으로이 기능은 $_GET과 작동합니다. 기반 on this discussionthis function을 수정하고 아래와 같은 것을 얻었습니다.파이프 라이닝을 사용한 서버 측 처리

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

PHP 측이 응답하고,이 테이블은 파이프 라인없이 100 % 작동 : 이제 문제는 파이어 버그는 다음 오류 메시지가

json.aaData is undefined @ line 99

을 제공합니다 (코드의 끝 부분에 위치) 라인이다. 하지만 파이프 라인이 오류가 사용하면 : 나는 무엇을 놓치고

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; 
    } 
} 

를? 어떠한 제안?

답변

2

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 % 맞는지 알 수 없습니다. 예를 들어, json.aaData.splice...을 시작하는 두 줄만 표시하는 것이 적절할 수있는 경우와 같이 if 절을 적게 넣어야 할 수도 있습니다.