2009-08-16 8 views
1

J'utilise une base de données YUI pour créer un tri basique côté client pour certaines statistiques, renvoyé via un service web que j'ai créé. Je ne voulais pas vraiment comprendre les sources de la source de données ajax de YUI, donc je charge les données via jquery et addRow() les données. Le problème est que toutes les données ne sont pas triées correctement. Le champ string semble être un ordre aléatoire, et les colonnes number/float semblent trier comme des chaînes (7 apparaît au-dessus de 635).YUI DataTable Tri

La définition initiale de la table est la suivante:

var myColumnDefs = [ 
    {key:"appname",label:"Application Name", sortable:true}, 
    {key:"membercount",label:"Member Count",formatter:YAHOO.widget.DataTable.formatNumber,sortable:true}, 
    {key:"loggedin",label:"Logged In",formatter:YAHOO.widget.DataTable.formatNumber,sortable:true}, 
    {key:"peakoccupance",label:"Peak Occupance",formatter:YAHOO.widget.DataTable.formatNumber,sortable:true}, 
    {key:"averageoccupance",label:"Average Occupance",formatter:YAHOO.widget.DataTable.formatFloat,sortable:true} 
]; 

this.myDataSource = new YAHOO.util.DataSource([]); 
this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY; 
this.myDataSource.responseSchema = { 
    fields: [{key:"appname", parser:YAHOO.util.DataSourceBase.parseString}, 
     {key:"membercount", parser:YAHOO.util.DataSourceBase.parseNumber}, 
     {key:"loggedin", parser:YAHOO.util.DataSourceBase.parseNumber}, 
     {key:"peakoccupance", parser:YAHOO.util.DataSourceBase.parseNumber}, 
     {key:"averageoccupance", parser:YAHOO.util.DataSourceBase.parseNumber} 
    ] 
}; 

this.myDataTable = new YAHOO.widget.DataTable("markup", myColumnDefs, this.myDataSource, 
     {sortedBy:{key:"membercount",dir:"desc"}} 
); 

Les données sont chargées comme ceci:

function xmlCallback(xml){ 
    if($(xml).find('memberCount').text() != "0"){ 
    var appName = $(xml).find('appname').text(); 
    var appID = $(xml).find('appid').text();   
    var memberCount = $(xml).find('memberCount').text(); 
    var zoneOccupance = $(xml).find('zoneOccupance').text(); 
    var peakOccupance = $(xml).find('peakOccupance').text(); 
    var averageOccupance = $(xml).find('averageOccupance').text(); 

    console.log(appName+" loaded..."); 

    if(memberCount != "0"){ 

     var allData = { 
     row: count, 
     appname: appName, 
     membercount: memberCount, 
     loggedin: zoneOccupance, 
     peakoccupance: peakOccupance, 
     averageoccupance: averageOccupance 
     }; 

     sococo.myDataTable.addRow(allData, count); 
     count++; 
     $("appsloaded").html(count); 
    } 
    else{ 
     appCount--; 
     $("totalapps").html(appCount); 
    } 
    } 
} 

Tout remplit, je viens d'obtenir un ordre de tri shite. Qu'est-ce que j'oublie ici?

Merci, Josh

Répondre

1

D'accord, compris cela après avoir trouvé un peu aléatoire de l'information dans l'un des échantillons de Yahoo. Apparemment, si vous ne définissez pas explicitement le champ sortedBy sur null après avoir effectué une mise à jour et que vous avez déclaré l'option sortedBy précédemment, il conservera l'ordre de tri précédemment trouvé. Ma conjecture est une sorte de mise en cache afin de ne pas effectuer le même côté client coûteux encore et encore.

Ainsi, le code qui fixe c'était le suivant:

var allData = { 
    row: count, 
    appname: String(appName), 
    membercount: Number(memberCount), 
    loggedin: Number(zoneOccupance), 
    peakoccupance: Number(peakOccupance), 
    averageoccupance: Number(averageOccupance) 
}; 

sococo.myDataTable.addRow(allData, count); 
sococo.myDataTable.set("sortedBy", null); 
+0

Si vos données ne sont pas triées pour commencer, il suffit de laisser le champ sortedBy. Créer une datatable avec sortedBy indique à YUI que les données sont déjà triées et qu'il doit conserver cet ordre de tri pour les tris futurs. –