2

我定义了一个带有多个选项卡的选项卡面板,在其中一个选项卡中我有一个带有网格和其他东西的面板。我定义了一个控制器来从网格中获取事件。虽然我可以从面板中获取事件,但无法从网格中获取事件。

这是视口在这里:

Ext.define('test.MyViewport', {
  extend: 'Ext.container.Viewport',

  layout: 'fit',

  items: {
      xtype: 'tabpanel',
      items: [{
          title: 'Tab 1',
          html: 'something'
      },{
          title: 'Tab 2',
          xtype: 'mypanel'
      },{
          title: 'Tab 3',
          html: 'something else 2'
      }]
  }

这是面板:

Ext.define('test.MyPanel', {
    extend: 'Ext.container.Container',
    alias: 'widget.mypanel',

    layout: {
        type: 'hbox',
        border: 1
    },

    items: [{
        xtype: 'mygrid',
        width: 300
    },{
        xtype: 'component',
        html: 'Hello There'
    }]
});

这是控制器:

Ext.define('test.MyController', {
    extend: 'Ext.app.Controller',

    init: function() {
        this.control({
            'mypanel': { show: function(){console.log( "Show Panel" );} },
            'mygrid': { show: function(){console.log( "Show Grid" );} }
        });  
    }
});

完整的代码可以在这个fiddle中测试。

我尝试了许多不同的选择器:

mypanel mygrid
#my-grid-id  (setting itemId on the grid item in the panel)
mypanel #my-grid-id
...

没有成功。我已经花了两天时间解决这个问题,但不知道如何解决它。我应该为该特定视图启动不同的控制器吗?如果是这样我应该把它放在哪里?

非常感谢

4

2 回答 2

1

好吧,这只是布局的方式......

您演示的卡片布局将隐藏“test.MyPanel”,因此show()每次激活选项卡时都会调用,但(幸运的是)并非所有“test.MyPanel”组件子组件都这样做。

为什么?因为没有必要。

它们本身并没有直接隐藏,仅通过它们的所有者 Container 隐藏,因此显示永远不会被调用,因此事件永远不会被触发。这就是布局的工作方式。因此,如果您将网格作为直接子元素放置到选项卡中,则 show 事件也会被触发。看到这个分叉的 JSFiddle

于 2013-06-01T15:33:18.570 回答
0

选择器没问题,问题是show网格的事件永远不会被触发。选项卡布局确实调用了show()其直接子级的方法,该方法会触发show事件,但大多数布局不会。

show您可以通过直接在网格定义中添加侦听器来确认网格的事件永远不会触发:

{
    xtype: 'mygrid',
    width: 300,
    height: 200,
    listeners: {
        // won't happen
        show: function() { alert('Grid show event') }
    }
}

您可以通过侦听其他事件来确认您的控制方法已正确获取对网格的引用:

    this.control({
        'mypanel': { show: function(){console.log( "Show Panel" );} },
        // will happen when you click on the grid's body
        'mygrid': { containerclick: function(){console.log( "Grid clicked" );} }
    });  
于 2013-06-01T13:04:38.937 回答