0

私はチャートを持っています:

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

このストアはローカルであり、別のストアを使用して自分で埋めることができますか。チャートにリンクされたストアを埋めるために使用される関数の最後の行は 'this.refreshpie()' です。ここにあります :

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

それらの線がない場合、グラフはまったく表示されません。.sync は非ローカルストアに使用する必要があるため、これは意味がありません...

問題は、チャートの表示でうまくいくことです...しかし、私が理解できなかったことが1つあります。

グラフにはデータ ツリーのレベルが表示されます。別のレベルに移動すると、そのレベルのノードでストアが更新されます。

何が起こるかというと、私が木に登ると、このような問題が発生します

ここに画像の説明を入力

古いデータ ラベルはチャートに残り (石炭、原子力)、新しいデータ ラベルがその上に追加されます... ストアをチェックしました。適切なモデルで満たされています。円グラフ モデル内でチェックできるすべてのものをチェックしましたが、できませんでした。めちゃくちゃなものを見つける...

すなわち。この図では、電力のみが表示されるはずです。

誰か助けてくれませんか、煎茶タッチチャートの黒魔術が私の忍耐力に勝っています。

チャートの回転(相互回転 - ジェスチャで続行)を行うと、ラベルがリセットされ、適切に表示されることを知っておくとよいでしょう...

4

1 に答える 1

0

Serie._label.instances配列 has を呼び出しましょうarrLabels

からシリーズを取得attributes.serieしますrenderer()

  • arrLabels5つの要素があるとしましょう。
  • 空にして、このチャートのストアに 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

于 2013-08-19T15:16:36.260 に答える