2015-12-23 2 views
0

Я пытаюсь использовать последние Highcharts для визуализации данных из Web API, который отформатирован в формате ISO. Я использую TypeScript и datejs (http://www.datejs.com/).Проблемы с рендерингом ISO Serialized DateTime JSON в серии Highcharts?

Я собираюсь обновить эту диаграмму в опросе, и серия может быть резко трансформирована между запросами, поэтому я решил уничтожить и воссоздать диаграмму с нуля. Я попытался установить параметры напрямую и перерисовать, но это не показало никакого эффекта.

Но, конечно, я прокомментировал создание и уничтожение начального графика, и у меня все еще была та же ошибка. Я проверил, чтобы парсер возвращал объект даты, и это так, и данные кажутся правильными.

Я предполагаю, что это имеет какое-то отношение к тому, как я строю свой элемент данных.

Это приемлемая структура данных временных рядов для высоких графиков:

var data: [Date, number][] = [, ]; 

Моя модель:

export interface Chart { 
    Title: string; 
    Series: ChartSeries[]; 
    XAxisTitle: string; 
    YAxisTtile: string; 
} 
export interface ChartSeries { 
    Title: string; 
    Points: ChartDataPoint[]; 
} 
export interface ChartDataPoint { 
    X: string; 
    Y: number; 
} 

приведен пример серии в XML (с помощью NewtonSoft.Json сделать JSon сериализация)

<ChartSeries> 
    <Points> 
     <ChartDataPoint> 
      <X>2015-12-16T00:00:00</X> 
      <Y>184</Y> 
     </ChartDataPoint> 
     <ChartDataPoint> 
      <X>2015-12-16T05:00:00</X> 
      <Y>168</Y> 
     </ChartDataPoint> 
     <ChartDataPoint> 
      <X>2015-12-16T07:00:00</X> 
      <Y>282</Y> 
     </ChartDataPoint> 
    </Points> 
    <Title>Version: UNK;Service Type: 1002;Server: UNK;Method Name: GetAllCustomerDetails 
    </Title> 
</ChartSeries> 

Соответствующая часть ViewModel:

Ошибка:

Line: 14084 
    Error: Unable to set property 'index' of undefined or null reference 

Некоторые контекст ошибки из highcharts.src.js:

generatePoints: function() { 
     var series = this, 
      options = series.options, 
      dataOptions = options.data, 
      data = series.data, 
      dataLength, 
      processedXData = series.processedXData, 
      processedYData = series.processedYData, 
      pointClass = series.pointClass, 
      processedDataLength = processedXData.length, 
      cropStart = series.cropStart || 0, 
      cursor, 
      hasGroupedData = series.hasGroupedData, 
      point, 
      points = [], 
      i; 

     if (!data && !hasGroupedData) { 
      var arr = []; 
      arr.length = dataOptions.length; 
      data = series.data = arr; 
     } 

     for (i = 0; i < processedDataLength; i++) { 
      cursor = cropStart + i; 
      if (!hasGroupedData) { 
       if (data[cursor]) { 
        point = data[cursor]; 
       } else if (dataOptions[cursor] !== UNDEFINED) { // #970 
        data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]); 
       } 
       points[i] = point; 
      } else { 
       // splat the y data in case of ohlc data array 
       points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i]))); 
      } 
      points[i].index = cursor; // For faster access in Point.update <-- error happens here, there is a single item in the collection that is undefined 
     } 

Как Запрошенный стек трассировки:

Series.generatePoints @ highcharts.src.js:14084 
Series.translate @ highcharts.src.js:14165 
(anonymous function) @ highcharts-more.js:53 
obj.(anonymous function) @ highcharts.src.js:660 
(anonymous function) @ highcharts.src.js:12830 
each @ highcharts.src.js:1106 
Chart.renderSeries @ highcharts.src.js:12829 
(anonymous function) @ highcharts-3d.js:26 
obj.(anonymous function) @ highcharts.src.js:660 
Chart.render @ highcharts.src.js:12937 
Chart.firstRender @ highcharts.src.js:13112 
Chart.init @ highcharts.src.js:11841 
(anonymous function) @ highcharts-3d.js:25 
obj.(anonymous function) @ highcharts.src.js:660 
Chart.getArgs @ highcharts.src.js:11746 
Highcharts.Chart @ highcharts.src.js:11720 
ChartViewModel.Draw @ ChartViewModel.ts:160 
(anonymous function) @ ChartViewModel.ts:180 
(anonymous function) @ jquery-2.1.4.js:3256 
fire @ jquery-2.1.4.js:3099 
self.fireWith @ jquery-2.1.4.js:3211 
deferred.(anonymous function) @ jquery-2.1.4.js:3301 
(anonymous function) @ ChartViewModel.ts:244 
(anonymous function) @ jquery-2.1.4.js:3256 
fire @ jquery-2.1.4.js:3099 
self.fireWith @ jquery-2.1.4.js:3211 
done @ jquery-2.1.4.js:8264 
(anonymous function) @ jquery-2.1.4.js:8605 
+1

в отсутствие более изолированного примера/исполняемый код/​​stacktrace люди могут бороться, чтобы помочь – basarat

+0

Я надеюсь, что это что-то g Очевидно – JasonLind

+0

Какой самый простой способ получить трассировку стека в javascript? – JasonLind

ответ

0

, как это получается две проблемы:

var data: [Date, number][] = [, ]; 

Для того, чтобы решить исключение:

var data: [Date, number][] = []; 

Для того, чтобы дни, чтобы правильно оказать:

var data: [number, number][] = []; 

и

var d = Date.parse(point.X); 
data.push([ 
Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()), 
point.Y 
]); 
Смежные вопросы