Amcharts неправильно отображает данные - PullRequest
0 голосов
/ 16 сентября 2009

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

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

Кто-нибудь знает, что не так с амхартами? Кажется, это проблема только с 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 Ответ

1 голос
/ 01 октября 2009

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

Сообщение на форуме имеет ответ разработчика.

...