2009-09-15 12 views
0

J'ai une configuration où j'utilise des amcharts qui sont des données de flux via appendData à partir d'un appel AJAX. L'appel va à une URL qui rend simplement le Time.now comme les lignes X et 8 en utilisant la fonction 2cos (x/2) + 2ln (ln est le numéro de ligne). La requête AJAX est faite toutes les secondes.Les diagrammes ne restituent pas correctement les données

Le backend est toujours correct et renvoie toujours un seul point, sauf s'il s'agit d'un X dupliqué dans lequel il renvoie une erreur. L'erreur provoque ne pas terminer et n'appelle donc pas appendData.

Quelqu'un at-il une idée de ce qui ne va pas avec les amcharts? Il semble que ce soit un problème uniquement avec appendData (que j'ai besoin de simuler une fenêtre glissante).

Le code Javascript est ci-dessous. Il suppose que la page crée un graphique linéaire avec 8 graphiques de points et le passe à setup_chart_loader. Netcordia.rapid_poller.updateChart est utilisé pour mettre à jour le graphique à l'aide de la requête Ajax

Ext.ns("Netcordia.rapid_poller"); 

Netcordia.rapid_poller.refresh_rate = 1; //seconds 
Netcordia.rapid_poller.pause = false; //causes the AJAX to suspend 
Netcordia.rapid_poller.chart = null; 
Netcordia.rapid_poller.stop = false; 

/* This function does everything that is required to get the chart data correct */ 
Netcordia.rapid_poller.setup_chart_loader = function(chart){ 
    assert(Netcordia.rapid_poller.displaySizeInMinutes,"No display size"); 
    assert(Netcordia.rapid_poller.delta_url, "Data URL is empty"); 
    assert(Netcordia.rapid_poller.delta_params, "No Data params"); 

    if(typeof(chart) !== 'object'){ 
    chart = document.getElementById(chart); 
    } 

    Netcordia.rapid_poller.chart = chart; 

    // 5 seconds raw polling 
    var maxPoints = Netcordia.rapid_poller.displaySizeInMinutes * 60/5; 
    var count = 0; 
    var lastUpdate = ''; 

    debug("max number of points: "+maxPoints); 

    debug('creating updateChart function'); 
    Netcordia.rapid_poller.updateChart = function(){ 
    debug("Sending Data request"); 
    var params = {last: lastUpdate, max: 1}; //maxPoints}; 
    //I have to do this otherwise amcharts get a lot of data and only renders 
    // one item, then the counts is off 
    if(lastUpdate === ''){params['max'] = maxPoints;} 
    if (Netcordia.rapid_poller.pause){ 
     alert("pausing"); 
     params['historical'] = 1; 
     params['max'] = maxPoints; 
    } 
    Ext.apply(params, Netcordia.rapid_poller.delta_params); 

    //this might need to be moved to within the Ajax request 
    // incase things start piling up 
    if(!Netcordia.rapid_poller.stop){ 
     setTimeout(Netcordia.rapid_poller.updateChart,1000*Netcordia.rapid_poller.refresh_rate); 
    } else { 
     debug("skipping next poll"); 
     return; 
    } 

    Ext.Ajax.request({ 
     url: Netcordia.rapid_poller.delta_url, 
     baseParams: Netcordia.rapid_poller.delta_params, 
     params: params, 
     success: function(response){ 
     //if(Netcordia.rapid_poller.pause){ 
     // debug("Data stopped"); 
     // return; 
     //} 

     var json = Ext.util.JSON.decode(response.responseText); 
     lastUpdate = json.lastUpdate; 

     if(json.count === 0){ 
      debug("no data to append"); 
      return; 
     } 

     debug("appending "+json.count); 

     var remove = (count + json.count) - maxPoints; 
     if(remove <= 0){ remove = 0; } 
     count += json.count; 
     if(count > maxPoints){ count = maxPoints; } 

     debug("removing "+remove); 
     debug("count: "+count); 

     if(Netcordia.rapid_poller.pause){ 
      alert("Pausing for historical"); 
      //append a zero point and delete the existing data 
      // amcharts can leak extra points onto the screen so deleting 
      // twice the number is 
      chart.appendData("00:00:00;0;0;0;0;0;0;0;0",(count*2).toString()); 
      count = json.count; 
      remove = 1; 
      Netcordia.rapid_poller.stop = true; 
     } 

     chart.appendData(json.lines.toString(),remove.toString()); 
     } 
    }); 
    }; 
}; 

Le code de rails qui renvoie les données sont comme suit:

def get_delta 
    max = 1 
    begin 
    current = Time.parse(params[:last]) 
    rescue 
    current = Time.now 
    end 

    if params[:historical] 
    max  = params[:max].to_i || 10 
    current = Time.at(current.to_i - (max/2)) 
    end 

    logger.info(current.to_i) 
    logger.info(max) 

    n = current.to_i 
    m = n+max-1 

    data = (n..m).collect do |x| 
    logger.info "For Point: #{x}" 
    point = Math.cos(x/2) 
    data = [Time.at(x).strftime("%H:%M:%S")] 
    for i in (1..8) 
     data.push(2*point+(2*i)); 
    end 
    data.join(";") 
    end 

    render :json => {count: data.size, lastUpdate: Time.now.strftime('%Y-%m-%d %H:%M:%S'), lines: data.join("\n")} 
end 

alt text

Répondre

1

semble être un bug dans Amcharts lui-même.

Forum Post a la réponse du développeur.

Questions connexes