如何从Extjs中的控制器调用视图监听器

时间:2013-05-05 17:25:42

标签: javascript extjs4 sencha-touch extjs-mvc

我的视图中有一个条形图,我有一个监听器正在检索条形码项,现在我必须从控制器调用该监听器这里是我的代码......

我认为这是听众..

listeners: {
    itemmousedown: function (obj) {
        alert(obj.storeItem.data['source'] + ' &' + obj.storeItem.data['count']);
    }
},

我必须从我的控制器调用这个监听器。这是我的代码..

init: function () {
    this.control({
        'barColumnChart': { //this is the id of the bar chart in my View
            click: function () {

            }
        }
    });
},

4 个答案:

答案 0 :(得分:0)

您是否尝试过使用'#barColumnChart'作为选择器?我有点生疏,但我认为这是你在控制器内部获取元素的方式。

答案 1 :(得分:0)

您没有“调用”侦听器,在触发事件时调用侦听器。 因此,您应该在控制器中设置itemmousedown侦听器,并将其从视图中删除。 我不知道哪个视图有itemmousedown事件,但如果它确实是条形图,它应该如下所示:

this.control({
    '#barColumnChart': { //this is the id of the bar chart in my View
        itemmousedown: function(obj) {
            alert(obj.storeItem.data['source'] + ' &' + obj.storeItem.data['count']);
        }
    }
});

但是,如果事件是另一个视图,则应将'#barColumnChart'替换为正确视图的id(或该视图的另一个选择器)

答案 2 :(得分:0)

如果在控制器中创建侦听器,则无需在视图中创建侦听器 在控制器中,您可以创建对视图的引用,如下所示:

refs: [{
    ref     : 'barColumnChart',
    selector: 'your_view'
}
   }]  

然后创建将在项目鼠标按下时调用的函数:

me.control({
'barColumnChart#your_chart': {
            click: me.your_function
        }
}),

your_function(button, e, options) {
        alert(obj.storeItem.data['source'] + ' &' + obj.storeItem.data['count']);
    }

答案 3 :(得分:0)

“系列”触发了itemmousedown事件,系列不是组件,仅在布局后由图表初始化。因此,为了获得对系列对象的引用,我们需要等待图表的afterlayout事件。但不幸的是,该图表并未触发后续事件...... 因此,首先覆盖图表的afterComponentLayout方法,以便触发事件:

Ext.define('MyNewChart',{
    extend: 'Ext.chart.Chart',
    afterComponentLayout: function(width, height, oldWidth, oldHeight) {
        this.callParent(arguments);
        this.fireEvent('afterlayout', this);
    }
});

现在,使用我们的新图表类来创建图表:

Ext.create('MyNewChart', {
     id: 'myChart',
     ...
});

现在我们可以创建一个实际上在itemmousedown事件上创建一个监听器的控制器:

Ext.define('Gamma.controller.ControlFile', {
    extend : 'Ext.app.Controller',
    initializedEvents: false,
    init: function() {
        this.control({
            '#myChart': {
                afterlayout: this.afterChartLayout
            }
        });
    },
    afterChartLayout: function(){
        if(this.initializedEvents==true) return;
        this.initializedEvents=true;
        Ext.getCmp('myChart').series.items[0].on('itemmousedown',function(obj){
            console.log(obj);
        });
    }
});

这是一个工作小提琴:http://jsfiddle.net/qjfBC/