ExtJS Как добавить событие щелчка к частям круговой диаграммы - PullRequest
6 голосов
/ 11 мая 2011

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

Ниже приведен код ExtJS.

Ext.onReady(function(){
var store = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'],
    data: [{
        'name': 'January',
        'data1': 10
    }, {
        'name': 'February',
        'data1': 7
    }, {
        'name': 'March',
        'data1': 5
    }, {
        'name': 'April',
        'data1': 2
    }, {
        'name': 'May',
        'data1': 27
    }]
});

Ext.create('Ext.chart.Chart', {
    renderTo: Ext.getBody(),
    width: 800,
    height: 600,
    animate: true,
    store: store,
    theme: 'Base:gradients',
    legend: { // Pie Chart Legend Position
        position: 'right'
    },
    series: [{
        type: 'pie',
        field: 'data1',
        showInLegend: true,
        tips: {
            trackMouse: true,
            width: 140,
            height: 28,
            renderer: function(storeItem, item){
                //calculate and display percentage on hover
                var total = 0;
                store.each(function(rec){
                    total += rec.get('data1');
                });
                this.setTitle(storeItem.get('name') + ': ' + Math.round(storeItem.get('data1') / total * 100) + '%');
            }
        },
        highlight: {
            segment: {
                margin: 5
            }
        },
        label: {
            field: 'name',
            display: 'rotate',
            contrast: true,
            font: '18px Arial'
        },
        listeners: {//This Doesnt Work :(
            itemclick: function(o){
                alert('clicked at : ' + o);
            }
        }

    }],
    listeners: { //This Event handler works but I am not sure how to figure how which slice i have clicked ..................................
        click: {

            element: store, //bind to the underlying el property on the panel
            fn: function(o, a){

                alert('clicked' + o + a + this);
            }
        }

    }

});

});

Пожалуйста, помогите.

С уважением, Лалит

Ответы [ 2 ]

12 голосов
/ 11 мая 2011

Вот как вы получаете данные о кликнувшем срезе.Класс series поддерживает прослушиватели через синтаксис Observable, и они:

  1. itemmouseup Когда пользователь взаимодействует с маркером.
  2. itemmousedown Когда пользователь взаимодействует с маркером.
  3. itemmousemove Когда пользователь выполняет итерацию с маркером.
  4. afterrender Будет запускаться после завершения анимации или после полной визуализации серии.

Я буду использовать событие itemmousedown для захвата щелкаемого фрагмента.Вот мой метод слушателя:

series: [{
        .
    .
    .
    listeners:{
        itemmousedown : function(obj) {
        alert(obj.storeItem.data['name'] + ' &' + obj.storeItem.data['data1']);
    }
    }
    .
}]

Обратите внимание, что я поместил своего слушателя в серию, а не в график!Теперь переменная obj содержит много информации.Для каждой серии свойство для получения данных будет отличаться.Итак, вам нужно будет тщательно осмотреть объект, используя firebug или какой-либо другой инструмент разработчика.

Теперь, в случае Piecharts, вы можете получить информацию о срезе с помощью obj:

obj.storeItem.data['your-series-variable-name']

Вот этот obj из клопа .. enter image description here

0 голосов
/ 15 сентября 2014

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

// Add drag-and-drop listeners to the sprites
var surface = chart.surface;
var items = surface.items.items;
for (var i = 0, ln = items.length; i < ln; i++) {
    var sprite = items[i];
    if (sprite.type != "circle") { continue; } // only add listeners to circles
    // Additional funky checks for the draggable sprites
    sprite.on("mousedown", onSpriteMouseDown, sprite); // mouse down ONLY for sprites
}
surface.on("mousemove", onSurfaceMouseMove, surface);  // mouse move for the entire surface
surface.on("mouseup", onSurfaceMouseUp, surface);

Ура! Frank

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...