2013-08-15 2 views
0

У меня есть график:Сенча Chart фантомные этикетки везде

Ext.define('CarboZero.view.PieChart', { 
    extend: 'Ext.chart.PolarChart', 
    alias: 'widget.piechart', 

    requires: [ 
     'CarboZero.view.override.PieChart' 
    ], 

    config: { 
     animate: false, 
     store: 'relativedata', 
     colors: [ 
      '#115fa6', 
      '#94ae0a', 
      '#a61120', 
      '#ff8809', 
      '#ffd13e', 
      '#a61187', 
      '#24ad9a', 
      '#7c7474', 
      '#a66111', 
      '#222222', 
      '#115ea6', 
      '#94cc0a', 
      '#b61120', 
      '#dd8809', 
      '#11d13e', 
      '#a68887', 
      '#94df9d', 
      '#7f74f4', 
      '#112341', 
      '#abcdef1' 
     ], 
     series: [ 
      { 
       type: 'pie', 
       renderer: function(sprite, record, attributes, index, store) { 

        if(record.type === 'label') 
        { 
         var total = Ext.getStore('relativedata').getTotal(); 
         var name = record.text; 
         var value = Ext.getStore('relativedata').getByName(name); 
         var ratio = Math.round((value/total)*10000)/100; 

         sprite.labelCfg.text = sprite.labelCfg.text +" : "+ ratio +"%"; 
        } 
       }, 
       labelField: 'strName', 
       xField: 'numValue' 
      } 
     ], 
     interactions: [ 
      { 
       type: 'rotate' 
      } 
     ], 
     legend: { 
      xtype: 'legend', 
      docked: 'bottom', 
      itemId: 'pie_legend', 
      itemTpl: [ 
       '<tpl if="value != 0">', 
       ' <span class="x-legend-item-marker {[values.disabled?\'x-legend-inactive\':\'\']}" style="background:{mark};"></span>{name}', 
       '</tpl>' 
      ], 
      maxItemCache: 100, 
      store: 'relativedata' 
     }, 
     listeners: [ 
      { 
       fn: 'onPolarInitialize', 
       event: 'initialize' 
      } 
     ] 
    } 

}); 

, который использует этот магазин

Ext.define('CarboZero.store.RelativeData', { 
    extend: 'Ext.data.Store', 
    alias: 'store.relativedata', 

    requires: [ 
     'CarboZero.model.RelativeElement' 
    ], 

    config: { 
     destroyRemovedRecords: false, 
     model: 'CarboZero.model.RelativeElement', 
     storeId: 'relativedata' 
    }, 

    getTotal: function() { 
     var total =0; 
     for(var i=0; i<this.getCount();i++) 
     { 
      total += this.getAt(i).get('numValue'); 
     } 

     return total; 
    }, 

    getByName: function(name) { 
     var value; 

     for(var i=0;i<this.getCount();i++) 
     { 
      if(this.getAt(i).get('strName')===name) 
      { 
       value = this.getAt(i).get('numValue'); 
       break; 
      } 

     } 
     return value; 
    } 

}); 

Я наполняю свой магазин с помощью этой функции:

var relStore = Ext.getStore('relativedata'); 
var eleStore = Ext.getStore('element'); 
var relModel; 
var eleModel; 
var boolAdded = false; 

relStore.removeAll(); 

//Convert to CO2 qty 
for(var i = 0; i< eleStore.getCount();i++) 
{ 
    eleModel = eleStore.getAt(i); 
    relModel = Ext.create(APPNAME + '.model.RelativeElement'); 
    relModel.set('strName',eleModel.get('strName')); 
    relModel.set('numValue', elementCompute(eleModel)); 
    if(eleModel.get('numValue')*eleModel.getFactor() >0) 
    { 
     boolAdded = true; 
     relStore.add(relModel); 
    } 
} 

APP.getController('TitleBar').parentToTitle(); 

//No element had a value superior to 0, nothing is displayed 
if(!boolAdded) 
{ 
    APP.getController('PopUp').chartAlert(); 
} 
this.refreshpie(); ///SPECIAL LINE NEEDED 

Has вас может видеть, что этот магазин является локальным и использует другой магазин, чтобы заполнить его самостоятельно. Последняя строка функции, используемой для заполнения привязанного к магазину привязки к диаграмме, - это this.refreshpie(), которая делает некоторую магию, но явно способствует решению моей проблемы. Вот он:

pie.sync(); 
pie.redraw(); 

Если этих строк нет, диаграмма не отображается вообще. Что не имеет смысла, так как .sync следует использовать для нелокального магазина ...

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

Моя диаграмма отображает уровень моего дерева данных, когда я перехожу на другой уровень, хранилище обновляется узлами этого уровня.

Что происходит, что, когда я иду в дереве, такого рода проблемы происходит

enter image description here

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

IE. На этом снимке должно отображаться только электричество.

Может кто-то помочь мне, черная магия сенсорных карт Сенча получает верхнюю часть моего терпения.

Хорошо бы знать, если бы я был сделать поворот диаграммы (вращение Интерактивного - Proced на жест) ярлыки будет сбросить themselve и отображается правильно ...

ответ

0

Давайте назовем Serie._label.instances массив имеет arrLabels.

Получить Серию из attributes.serie в renderer()

  • Скажем arrLabels имеет 5 элементов в нем.
  • Теперь давайте пустым и добавим в магазин этой диаграммы 3 новых элемента.
  • Sencha ОБНОВЛЯЕТ 3 первых ячейки новыми данными, но не удалит последние 2, которые теперь бесполезны.
  • Эти последние 2 появятся на графике, даже если их вообще не должно быть.

Моим решением было сделать двойную проверку и нарезать эти элементы arrLabels.slice(index,1) и chart.refresh().

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

renderer() на самом деле называется 4 раз по спрайтов для отображения O(4n) ...

Плюс мы знаем, что вам нужно проверить, нуждается ли элемент, который будет отображаться или нет, которые бы в O(N).

Таким образом, это будет O(n^(4n)) приблизительно O(n^n).

Об этом сообщается, команда sencha, вероятно, должна что-то предпринять.

Сообщение об ошибке: http://www.sencha.com/forum/showthread.php?270229-Chart-Serie._Label_instances-Updating-is-not-working-properly

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