聆听视图控制器之间的事件

时间:2014-05-14 19:04:03

标签: extjs controller listener listen

我无法弄清楚如何从另一个ViewController中侦听在一个View Controller中触发的事件。

我的网格组件定义了一个监听器

selModel: {
    listeners: {
        selectionchange: 'onChemClick'
    }
},

我的ViewController(称为chemslist)具有触发另一个事件的功能

onChemClick: function(view, selected) {
    console.log("before firing");
    this.fireEvent('canvasData', this, selected.length);
    console.log("after firing");
    console.log(selected);
}

我有另一个控制器实际侦听此事件并显示数据。

Ext.define('view.canvas.CanvasController', {
extend: 'Ext.app.ViewController',
alias: 'controller.canvas',

listen: {
    controller: {
        chemslist: {
            canvasData: 'onCanvasData'
        }
    }
},

onCanvasData: function() {
    console.log("At Fire");
}

});

出于某种原因,我无法弄清楚为什么CanvasController无法收听事件。我也查看了Ticket示例并查看了如何触发事件以及其他viewControllers监听它们。

如果一个区域中的网格上的选择导致另一个面板中的大量更改,那么最佳实践是什么?如果事件被触发为全局,那么所有组件都会听取它?或者我应该在主控制器(而不是ViewController)中听它并根据事件生成组件?

谢谢!

3 个答案:

答案 0 :(得分:3)

文档说:

  

选择器可以是控制器ID,也可以是' *'任何控制器的通配符。

与直觉相反,我们不应该将任何id或itemId分配给我们想要监听的控制器,但id由Application自动创建,id等于控制器类名。

我已经制作simple example - 按钮,2个控制器C1听按钮,C2听C1。

答案 1 :(得分:3)

事件处理也在ViewControllers之间工作,但你需要在listen配置中提供控制器的id(如Saki所述),对于你的例子,触发ViewController:

Ext.define('Edsp.view.chemslist.ChemsListController', {
extend: 'Ext.app.ViewController',
alias: 'controller.chemslist',
id: 'chemslist',

监听ViewController看起来像这样:

Ext.define('Edsp.view.canvas.CanvasController', {
extend: 'Ext.app.ViewController',
alias: 'controller.canvas',

listen: {
    controller: {
        '#chemslist': {
            canvasData: 'onCanvasData'
        }
    }
},

答案 2 :(得分:2)

小修正,id不需要哈希,实际上不能用它,应该是:

listen: {
controller: {
    'chemslist': {
        canvasData: 'onCanvasData'
    }
}