2009-12-08 2 views
1

Je fais un peu de personnalisation à ce script de pagination jQuery J'ai trouvé ici Paging Through Records Using jQuerysi index> 0: boucle; autre: faire une seule fois (JSON & jQuery)

J'ai la recherche de personnes travaillant bien, et il gère différentes réponses javascript de façon appropriée.

J'ai un problème cependant. La réponse s'attend à ce que le JSON ait un index/tableau.

90% du temps, j'ai plusieurs entrées dans mon JSON, mais parfois je n'ai qu'un seul élément renvoyé. Cela entraîne des entrées nulles.

Voici le code que j'ai

var pagedContent = { 
    data: null 
    ,holder: null 
    ,currentIndex : 0 
    ,init: function(data, holder) { 
     jQuery("body").data(holder,data); 
     this.holder=holder; 
     this.show(0, holder); // show last 
    } 
    ,show: function(index, holder) { 
     this.data=jQuery("body").data(holder); 
     if(!this.data){ 
      return; 
     } 
     var j=2; 
     if(this.data.length-index<=j){ 
      j=this.data.length-index-1; 
     } 
     var jsonObj = this.data[index]; 
     if(!jsonObj) { 
      return; 
     } 
     var holdSubset=""; 
     for(i=0;i<=j;i++){ 
      jsonObj=this.data[index+i]; 
      this.currentIndex = index; 
      if(this.holder=="id1"){ 
      var theResultVariables = jsonObj.whatever 
      var resultInput='<div class="putstuff">'+theResultVariables+'</div>'; 
      } 
      if(this.holder=="id2"){ 
      var theResultVariables = jsonObj.whatever 
      var resultInput='<div class="putstuff2">'+theResultVariables+'</div>'; 
      } 
      holdSubset= holdSubset+resultInput; 
     } 

     jQuery("body").html("<div id=\"counter\">"+parseFloat(index+1)+" to "+ parseFloat(index+j+1)+" of "+this.data.length+"</div>"+holdSubset+"<div class=\"prevNext\"></div>"); 

     if(index!=0){ 
      var previous = jQuery("<a >").attr("href","#").click(this.previousHandler).text("< previous").data("whichList",this.holder).data("thisIndex",index - 2-1); 
      jQuery("body").append(previous); 
     } 

     if(index+i<this.data.length){ 
      var next = jQuery("<a class=\"next\">").attr("href","#").click(this.nextHandler).text("next >").data("whichList",this.holder).data("thisIndex",index + 2 +1); 
      jQuery("body").append(next); 
     } 
    } 
    ,nextHandler: function() { 
     pagedContent.show(jQuery(this).data("thisIndex"), jQuery(this).data("whichList")); 
     return false; 
    } 
    ,previousHandler: function() { 
     pagedContent.show(jQuery(this).data("thisIndex"), jQuery(this).data("whichList")); 
     return false 
    } 
}; 

Je sais que je peux ajouter un autre chèque

var jsonObj = this.data[index]; 
if(!jsonObj){ 
    var jsonObj=this.data; 
} 
if(!jsonObj) { 
    return; 
} 

puis plus bas

jsonObj=this.data[index+i]; 
if(!jsonObj){ 
    jsonObj=this.data; 
} 

Mais je ne pense que c'est probablement le moyen le plus efficace de le faire. Des idées?

+0

@pedalpete: Je sais qu'il est tentant d'envoyer tout votre code, mais ... pas. 95% (probablement plus) du code que vous avez posté ici n'a rien à voir avec votre problème réel. Vous forcez tout le monde à le lire et à arriver à cette conclusion. Trouver l'exemple de code * abstract * minimal qui reproduit votre problème aide tout le monde, y compris ceux qui pourraient avoir un problème similaire dans une forme différente et venir ici via la recherche. – Tomalak

+0

J'ai effectivement supprimé un tas de code, mais peut-être pas assez. Je voulais donner assez de contexte pour ne pas laisser de questions. J'apprends cet acte d'équilibrage. Je vais essayer de faire mieux. – pedalpete

Répondre

2

Puisque vous utilisez jQuery, jetez un oeil à jQuery.makeArray. Il prend un tableau ou un scalaire et retourne un tableau. Si vous ajoutez un appel comme celui-ci en tant étape précédente:

this.data = jQuery.makeArray(this.data); 

Vous n'aurez pas à vous soucier si elle est un scalaire ou un tableau. Les scalaires seront convertis en tableaux de longueur 1.