2012-10-04 43 views
2

我试图响应控制器内部的视图触发事件。该事件确实触发,但控制器操作从未被调用。未被控制器捕获的事件

查看

Ext.define("MyApp.view.Dashboard", { 
    extend: 'Ext.Container', 
    xtype: 'my_dashboard', 
    config: { 
     items: [ 
      { 
       xtype: 'dataview', 
       listeners: { 
        itemtap: function(sender, index, elem, record) { 
         // fires with param, e.g. 'inbox' 
         this.fireEvent(record.get('name')); 
        } 
       } 
      } 
      ... 

控制器

Ext.define('MyApp.controller.Dashboard', { 
    extend: 'Ext.app.Controller', 
    config: { 
     control: { 
      'my_dashboard': { 
       'inbox': 'showInbox', 
       ... 
      } 
     } 
    }, 

    showInbox: function() { 
     /* never gets called */ 
    }, 

    ... 

我在做什么错?

UPDATE

我找到了解决办法,但感觉非常哈克。我在数据视图,my_dashboard视图中添加了bubbleEvents配置,并且事件开始进入控制器。

由于仪表板可以具有可变数量的项目,因此我不知道需要冒出哪些事件。当然,我可以冒泡所有可能的仪表板事件,但这似乎是一个巨大的混乱。

如果视图触发应用程序事件,例如, MyApp.app.fireEvent()

+0

我不知道,但它可能是一个范围的问题。也许事件是在dataview上触发的,而不是在my_dashboard容器上触发的。试试这个:''my_dashboard dataview':{'inbox':'showInbox',...}'。 –

+1

@TDeBailleul:是的,这正是发生了什么,我目前的解决方法是从'my_dashboard'级别(使用'this.parent.fireEvent()')触发事件。我想在控制器中使用更具体的选择器,但我不希望控制器必须知道视图的内部结构。 – alekop

+0

所以问题解决了?你不希望你的控制器知道视图的内部结构的任何特定原因? –

回答

0

我会在数据视图上放一个itemId

在您的控制器
itemId: 'my_dashboard_dataview' 

则...

control: { 
      '#my_dashboard_dataview': { 
       'itemtap': 'showInbox', 
       ... 
      } 
     } 
0

UPDATE

下面是一些代码,应该让你开始:

控制器:

Ext.define('MyApp.controller.Dashboard', { 
    extend: 'Ext.app.Controller', 
    config: { 
     control: { 
      'my_dashboard': { 
       painted: 'onDashboardPainted', 
       inbox: 'showInbox' 
      } 
     } 
    }, 

    onDashboardPainted: function(dashboard, eOpts) { 
     dashboard.down('dataview').on('itemtap', function(sender, index, elem, record){ 
      dashboard.fireEvent(record.get('name')); 
      //check the console to make sure you the value is: inbox 
      console.log(record.get('name')); 
     }); 
    }, 

    showInbox: function() { 
     console.log('showInbox init'); 
    }, 

这肯定是一个范围的问题......在你的控制器中添加绘功能my_dashboard ...第一个函数变量将是my_dashboard组件本身:

painted: function(dashboard,... 

现在在画函数添加动态监听器:

dashboard.down('dataview').on( ...的监听器代码休息...

现在收听的内部做dashboard.fireEvent(....);

对不起,我的手机格式化IM,如果u不能得到它的工作我会后的代码明天