2015-04-24 3 views
1

У меня есть диаграмма Сенча, где я обрабатываю некоторые точки данных определенного цвета в зависимости от значений в моем хранилище данных. Это прекрасно работает и долго, поскольку я не масштабирую диаграмму, но поскольку я увеличиваю ось x диаграммы, выделенная точка данных перемещается, потому что индекс функции рендеринга больше не соответствует индексу записи в магазин. Смотрите эту скрипку: https://fiddle.sencha.com/#fiddle/ls3 -> Увеличенный ось хОказание точек данных в диаграммах Сенча

Оригинальная схема: The original chart Диаграмма после увеличения и уменьшения масштаба еще раз (вторая красная точка не должна быть там): The chart after zooming in and out again

Есть способ избежать такого поведения?

Заранее благодарен!

+1

Когда я увеличил масштаб - я вижу, что точки данных также перемещаются, что, я думаю, ожидается. Или, может быть, я не понимаю. Не могли бы вы также приложить скриншот? – Yellen

+0

Я редактировал свой пост. Надеюсь, это делает проблему ясной. – stefan

+0

Это озадачивает. Он входит в условие if дважды. попробуйте удалить это условие config.type === 'marker' и попытаться увеличить масштаб изображения ... вы заметите что-то, что может дать некоторые подсказки. – Yellen

ответ

2

Это некоторые документально поведение, даже если документ, очевидно, дразня вас:

Это, как правило, индекс записи магазина, связанного с спрайта

Там, кажется, не быть информацией в аргументах, переданных рендереру, которые могут быть использованы для получения записи безошибочным способом ... Однако информация method that calls the renderer содержит информацию, поэтому простое сохранение может сохранить день (fixed fiddle):

// I like to name overrides after the overridden class, but do as per your tastes 
Ext.define('MyApp.overrides.Ext.chart.series.sprite.Line.RendererIndex', { 
    override: 'Ext.chart.series.sprite.Line', 

    // The parent method will call the renderer, and knows the start index... 
    // but it won't give it to you, so let's help ourselve and store it now. 
    renderAggregates: function (aggregates, start, end, surface, ctx, clip, region) { 
     this.renderingRangeStart = start; 
     return this.callParent(arguments); 
    }, 

    // Utility method to convert the index into some useful piece of information, 
    // that is a store record. The name is a bit circumvoluted in order to avoid 
    // collision with some future code from Sencha 
    getRecordAtRenderIndex: function(index) { 
     var store = this.getStore(); 
     if (store) { 
      return store.getAt(this.renderingRangeStart + index); 
     } 
    } 
}); 

В родительском методе, это линия, которая вызывает визуализатор:

markerCfg = attr.renderer.call(this, this, markerCfg, {store:this.getStore()}, i/3) || {}; 

Можно было искушение изменить эту строку, чтобы «исправить» аргументы, передаваемые в рендерер, но (1), что может разорвать другие существующие средства визуализации и (2), которые потребуют скопировать весь код метода, который всегда будет освещенным битом, беспокоящим будущее. Я думаю, что лучше всего «обойти» код; что стало возможным здесь легко, так как недостающая информация сидит в аргументах переопределенного метода.

+0

Работает отлично, спасибо большое! – stefan

+0

Идеальное решение. :) Просто FYI, я сообщил об этом Sencha, и они приняли эту ошибку. :) Должно быть исправлено в более позднем выпуске. – Yellen

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