ExtJS:检查Component是否是Ext.TabPanel的直接后代

时间:2012-12-18 08:41:21

标签: javascript extjs

到目前为止,我的每一个问题都已经在这里被问到并回答了,非常感谢我已经到过这里的所有时间机器帮助。 :)但一切都结束了一天,所以这是我自己的第一个问题:

出于错误处理的目的,我正在尝试将一些通用侦听器附加到所有有趣的组件中。这可以使用Ext.ComponentMgr.all.on('add', function (cnt, cmp) {})完成。然后我查看它是什么类型的组件,例如为每个按钮添加一个点击监听器。

我现在需要做的是为每个添加到tabpanel的面板添加一个激活监听器。我的问题是:我不知道如何确定组件是否是tabpanel的直接后代以及如何以正确的方式执行。

我已经尝试过了:

Ext.ComponentMgr.all.on('add', function (cnt, cmp) {
    if (cmp.ownerCt != undefined && cmp.ownerCt.getXType () == 'tabpanel') {
        console.log (cmp.getXType () + ' in tabpanel with id "' + cmp.getId ());
    }
});

糟糕的是,一些Ext doc读取“不要依赖ownerCt”并且它是正确的:我的所有其他组件都有一个ownerCt,但是在向tabpanels添加时没有面板。

我知道有Ext.Panel.findParentByType(),但这会在上面的任何级别找到容器,我认为这不是正确的方法( - >性能)。

提前感谢您的每一个答案!

2 个答案:

答案 0 :(得分:0)

正如你所说,所有者可能会在施工过程中的任何时间进行探查,具体取决于你的执行顺序。为什么不创建一个自动为您处理它的选项卡面板子类?

答案 1 :(得分:0)

我已经做了一些试验和错误,并为自己找到了解决方案。我想我应该和你分享,或许有人可以在某一天使用它:

Ext.ComponentMgr.all.on('add', function (cnt, cmp) {})触发时,ownerCt当然是空的,因为该组件只是已创建,但未必添加到另一个组件。

所以我做了以下事情:

Ext.ComponentMgr.all.on('add', function (cnt, cmp) {
  cmp.addListener ('added', function (cmp) {
    var parent = cmp.findParentByType ('tabpanel');
    if (parent != undefined) {
      if (parent.items.contains (cmp)) {
        cmp.addListener ('activate', function (cmp) {
          doThings();
        });
      }
    }
  });
}
  • 将组件添加到组件管理器(new Ext.Panel())时,为组件added创建一个侦听器
  • 添加后,检查是否有父母是tabpanel
  • 如果是,请检查您的组件是否是tabpanel的直接后代(=包含在其项目中)
  • ???
  • 利润!