2014-01-10 34 views
0

我一直在配置Ext.Container及其子項與項目時遇到問題。我一直想這樣的東西:Extjs 3.4.0,爲什麼我不能使用items配置Ext.Container?

var PanelSubclass = Ext.extend(Ext.Panel, { 
    debugID: "DavidPanel", 
    items: [{ 
     debugID: "DavidNumberField", 
     xtype: "numberfield" 
    }] 
}); 
new PanelSubclass() //blows up 

我已經想通了,到目前爲止,在initComponent時間Ext.Container將調用add(項目)本身對每個配置項。作爲參考,這裏是Ext.Container.add源:

add : function(comp){ 
    this.initItems(); 
    var args = arguments.length > 1; 
    if(args || Ext.isArray(comp)){ 
     var result = []; 
     Ext.each(args ? arguments : comp, function(c){ 
      result.push(this.add(c)); 
     }, this); 
     return result; 
    } 
    var c = this.lookupComponent(this.applyDefaults(comp)); 
    var index = this.items.length; 
    if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){ 
     this.items.add(c); 
     // *onAdded 
     c.onAdded(this, index); 
     this.onAdd(c); 
     this.fireEvent('add', this, c, index); 
    } 
    return c; 
} 

該方法的第一行調用initItems(),它建立了一個容器的內部項目Ext.util.MixedCollection像這樣:

initItems : function(){ 
    if(!this.items){ 
     this.items = new Ext.util.MixedCollection(false, this.getComponentId); 
     this.getLayout(); // initialize the layout 
    } 
} 

所以它看起來像什麼導致我的問題是,我已經在我的配置中指定的項目,以便在if(!this.items)檢查返回false和項目的真實Ext.util.MixedCollection是從未設置爲我的集裝箱。

但是,這並沒有任何意義,因爲你應該能夠給出一個集裝箱的一些項目,所以我在想如何在地球上創建一個包含任何事情的任何管理工作的容器。我在這裏做錯了什麼?

回答

0

,我得到的煎茶論壇是答案是:

Ext.define('Foo', { 
    extend: 'Ext.Container', 
    initComponent: function() { 
     this.items = []; 
     Foo.superclass.initComponent.call(this); 
    } 
}); 

我使用翻譯,爲這個解決方案Ext.extend:

var PanelSubclass = Ext.extend(Ext.Panel, { 
    debugID: "DavidPanel", 
    initComponent: function(){ 
     this.items = [{ 
      debugID: "DavidNumberField", 
      xtype: "numberfield" 
     }]; 
     PanelSubclass.superclass.initComponent.call(this); 
    } 
}); 
new PanelSubclass(); 

這兩個都可以。

0

我覺得你真的搜索太遠。爲什麼你一直在尋找分析源代碼的方法。就像文檔所說的那樣。我從來沒有用過extjs 3.4,我只用過4.2。這就是爲什麼我不能非常具體。在ExtJS的4.2你可以這樣寫:

Ext.define('Myapp.MyPanel', { 
    extend: 'Ext.panel.Panel', 
    debugID: "DavidPanel", 
    items: [{ 
     debugID: "DavidNumberField", 
     xtype: "numberfield" 
    }] 
}); 
Ext.create('Myapp.MyPanel'); 
+0

謝謝您的回答。在Extjs 3.4的文檔中,它說項目是一個有效的配置屬性,可以提供給Container。大多數情況下,我發現自己在文檔不起作用並且文檔沒有幫助時深入研究文檔。我不知道4中的情況是否有所好轉,但3的文檔往往有點糟糕。 – David

+0

當然項目配置是有效的。它必須工作。這不是我的意思。我覺得奇怪的是,你擴展了一個內置的類而不是定義你自己的類,並且你使用new來實例化它。至少在extjs 4.2中,你不能使用new,但Ext.create –

相關問題