在类定义中Extjs itemId

时间:2015-04-29 12:52:05

标签: javascript extjs extjs4

在类定义(而不是实例化)上使用itemId配置是不好的做法?

是否有一些支持它的官方文档或只是意见问题?

或许有一些我错过的逻辑表明这是一种不好的做法。

Ext.define('SomeApp.view.SomeFolder.MySpecialComponent',{
    extend: 'Ext.panel.Panel',
    itemId: 'specialComponent'
    // ...
});

因为我确实理解如果有多个实例并且我使用itemId作为选择器,我会得到两个实例。但是,让我们说我知道我一次不会有超过1个实例,并且让我们说实例化可能发生在3个不同的地方,我不想添加itemId在这3个不同的地方,我当然不希望那些itemId's不同。

关于在类定义中使用itemId配置是否存在官方态度?

1 个答案:

答案 0 :(得分:3)

来自Ext.AbstractComponent.itemId的文档:

  

当没有对象引用可用时,itemId可用作获取组件引用的替代方法。不要使用带有Ext.getCmp的id,而是使用带有Ext.container.Container.getComponent的itemId,它将检索itemId或id。 由于itemId是容器的内部MixedCollection 的索引,因此itemId在本地范围内限定容器 - 避免与需要唯一ID的Ext.ComponentManager发生潜在冲突。< / p>

由于itemId用作索引,因此它在容器中必须是唯一的。如果您将具有相同itemId的任何组件的两个实例添加到同一容器中,则第二个实际上会覆盖第一个实例。

您可以在这个小提琴中观察到这种行为:https://fiddle.sencha.com/#fiddle/m2n

特别是考虑到这个事实,在我看来,直接在类定义中指定itemId是没有意义的,因为:

  • 如果你想将这个组件的多个实例添加到同一个容器中,它就行不通(除非你在实例化时再次覆盖itemId)。
  • 如果不是这种情况,那么您可能要考虑根本不指定itemId。相反,您可以通过其xtype获取实例:

    // assuming the xtype is 'specialcomponent'
    container.query('specialcomponent')
    
  • 您实际上在实例化时隐藏了itemId,这使得理解它来自哪里变得更加困难

    var ct = Ext.create('Ext.container.Container', {
        items: [{
            // not clear that this will have itemId 'specialComponent'
            xtype: 'specialcomponent'
        },{
            xtype: 'panel',
            itemId: 'somePanel'
        }];