2009-09-15 2 views
0

У меня есть настройка, где я использую amcharts, которые передают данные через appendData из вызова AJAX. Вызов переходит к URL-адресу, который просто отображает Time.now как X и 8 строк, используя функцию 2cos (x/2) + 2ln (ln - номер строки). Запрос AJAX выполняется каждые 1 секунду.Ошибка отображения данных Amcharts

Бэкэнд всегда правильный и всегда возвращает одну точку, если только это не дубликат X, в котором он выдает ошибку. Ошибка не завершается и поэтому не вызывает appendData.

У кого-нибудь есть идеи, что происходит с amcharts? Кажется, это проблема только с appendData (которую мне нужно смоделировать скользящее окно).

Код Javascript приведен ниже. Предполагается, что страница создает линейную диаграмму с 8-точечными графиками и передает ее в setup_chart_loader. Netcordia.rapid_poller.updateChart используется для обновления диаграммы с помощью запроса 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()); 
     } 
    }); 
    }; 
}; 

Рельсы код, который возвращает данные следующим образом:

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

ответ

1

Кажется, ошибка в Амчарте.

Forum Post имеет ответ разработчика.

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