2012-05-10 3 views
4

По умолчанию эта функция работает с $_GET. На основании on this discussion я изменил this function и получил что-то вроде ниже. Теперь проблема, Firebug дает сообщение об ошибкеОбработка на стороне сервера с конвейерной обработкой

json.aaData is undefined @ line 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; 
    } 
} 

Что я упускаю? Любое предложение?

ответ

2

json получает свои свойства, внутри fnDataTablesPipeline(), от 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, например, может быть целесообразно подавить только две строки, начинающиеся с json.aaData.splice....

Смежные вопросы