2012-05-10 5 views
4

Par défaut, cette fonction fonctionne avec $_GET. Basé on this discussion J'ai modifié this function et j'ai obtenu quelque chose comme ci-dessous. Maintenant, le problème est, Firebug donne un message d'erreurTraitement côté serveur avec pipelining

json.aaData is undefined @ line 99

Voici ligne (situé à la fin du code):

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

côté PHP répond, et ce tableau fonctionne 100% sans pipelining. Mais quand je pipelining obtenir cette activer erreur:

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

Qu'est-ce que je manque? Toute suggestion?

Répondre

2

json obtient ses propriétés, à l'intérieur fnDataTablesPipeline(), à partir de oCache.lastJson mais seulement si bNeedServer est vrai.

Si fnDataTablesPipeline() n'a jamais été appelé ou a été appelé, mais bNeedServer est restée fausse, la ligne oCache.lastJson = jQuery.extend(true, {}, data); aura pas été exécutée et json.aaData.splice() échouera.

Vous devez gérer le cas où oCache.lastJson n'est pas remplie (ou seulement partiellement peuplée) soit:

  • en initialisant oCache.lastJson propriétés par défaut
  • en testant l'existence de propriétés avant d'essayer de les utiliser et agir en conséquence,

Par exemple:

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

Je ne peux pas dire si c'est 100% correct. Vous devrez peut-être mettre moins dans la clause if, par exemple, il peut être approprié de supprimer uniquement les deux lignes commençant json.aaData.splice....

Questions connexes