3

在下面的应用程序中,我试图将id's 动态添加到生成的项目中。我的代码工作正常,但是当我在其中添加以下两条注释行时。它抛出错误

未捕获的 Ext.AbstractManager.register():向该管理器注册重复的 id "73"


当我试图找出错误的来源时,我发现代码运行良好,直到执行81id's ( console.log(_idGen))。由此可见,该错误与超出范围异常有关。(9*9 = 81) 并且仅在 Fiddle 中,当我将 HTML 文本添加到子面板时,我才知道它们在73 to 81??( 而不是1 to 81) 之间,这让我很困惑,怎么办?

小提琴

Ext.onReady(function(){
  var _idGen = 1;
  var childItems = [], items = [];

  for (var i = 0; i < 9; i++) {
    childItems.length = 0;
    for (var j = 0; j < 9; j++) {
       childItems.push({
           xtype: 'panel',
 /****************************/
           id: _idGen,
           html: _idGen + "",
 /****************************/
           width: 50,
           height: 50,
           style: {borderWidth: '1px'}
       });
       console.log(_idGen);
/*****************************/
       _idGen++;
/*****************************/
    }
    items.push({
        xtype: 'panel',
        layout: {
            type: 'table',
            columns: 3
        },

        items: childItems
    });
  }
  Ext.create('Ext.container.Container', {
     layout: {
        type: 'table',
        // The total column count must be specified here
        columns: 3
     },
     renderTo: Ext.getBody(),    
     style: {width: '455px',marginLeft: 'auto',marginRight: 'auto', marginTop: '30px'},
     items: items
  });

});
4

1 回答 1

4

如果不是严格要求,请不要用您的韩元创建 ID!

它始终是错误的来源,所以当框架已经照顾好时,为什么还要为此烦恼。

使用自定义标识符属性或更好的,框架已经支持的属性itemId。该属性只需要在每个组件级别中是唯一的。您还可以使用该getComponent('your-item-id')方法接收嵌套到调用组件中的组件。

我已修改您的示例以使用itemId's并在底部为您提供演示查询

JSFiddle

var _idGen = 1,
      _outerIdGen = 1;
  var childItems = [], items = [];

  for (var i = 0; i < 9; i++) {
  // You will keep the same array with and just alter all instances each time. 
  // This is what causes all your problems and the duplicates!      
  // childItems.length = 0; 
  // But you need a new array each time
    childItems = [];
    for (var j = 0; j < 9; j++) {
       childItems.push({
           xtype: 'panel',
           itemId: 'inner-'+_idGen++,
           html: _idGen + "",
           width: 50,
           height: 50,
           style: {margin: '1px',borderColor: 'white',backgroundColor:'cornflowerblue'}
       });
    }
    items.push({
        xtype: 'panel',
        layout: {
            type: 'table',
            columns: 3
        },
        itemId: 'outer-'+_outerIdGen++,
        items: childItems
    });
  }
  Ext.create('Ext.container.Container', {
     layout: {
        type: 'table',
        // The total column count must be specified here
        columns: 3
     },
     renderTo: Ext.getBody(),    
     style: {width: '455px',marginLeft: 'auto',marginRight: 'auto', marginTop: '30px'},
     items: items
  });
  console.log(Ext.ComponentQuery.query('container > panel[itemId=outer-1] > panel[itemId=inner-73]')[0]);
于 2013-02-05T07:44:10.960 回答