2013-08-20 89 views
0

我開發了一個有幾個窗口的應用程序。許多窗口是相似的,所以我想寫一個超類,並擴展它。擴展自己的類

我有,超:

Ext.define('AM.view.ui.DecoratorAbstract',{ 
    extend: 'Ext.window.Window', 
    alias: 'widget.decoratorAbstract', 

    initComponent: function(){ 
     this.title = this.aTitle; 
     this.resizable = this.cfg[0]; 
     this.closable = this.cfg[1]; 
     this.minimizable = this.cfg[2]; 
     //this.items = this.anItem; 
     this.callParent(arguments); 
    } 
}); 

類和子類:

Ext.define('AM.view.ui.DecoratorForm',{ 
    extend: 'AM.view.ui.DecoratorAbstract', 
    alias: 'widget.decoratorForm', 

    initComponent: function(){ 
     this.callParent(); 
     this.buttons = [ 
      { text:'Guardar', action:'save', iconCls: 'ico-save' }, 
      { text:'Cancelar', action:'cancel', iconCls: 'ico-cancel' } 
     ]; 
    } 
}); 

兩個類都包含在控制器:

Ext.define('AM.controller.Ui',{ 
    extend: 'Ext.app.Controller', 

    views: [ 
     'ui.Toolbar', 
     'ui.Statusbar', 
     'ui.AlertErr', 
     'ui.AlertOk', 
     'ui.AlertWar', 
     'ui.AlertDelete', 
     'ui.AlertUndelete', 
     'ui.DecoratorAbstract', 
     'ui.DecoratorForm', 
     'ui.DecoratorGrid' 
    ], 
    model: [], 
    store: [], 
}); 

從Firebug的JS控制檯我創建子類:

Ext.create('AM.view.ui.DecoratorForm',{cfg:[true,true,true],aTitle: 'Title'}).show(); 

窗口顯示,但不是按鈕。 有什麼想法?

回答

0

如果你移動

this.callParent(arguments); 

要initComponent在你DecoratorForm結束。

+0

嚴格地說,'initComponent'不會收到任何參數。 'this.callParent();'應該足夠了。 – Eric

1

這裏有幾件事...首先,將this.callParent()移動到您的initComponent的末尾。這是因爲initComponent進一步繼承了this.buttons,並且在設置按鈕之前通過調用callParent錯過了這一點。

接下來,你真的不應該使用這個cfg事情要傳遞的只是傳遞中要使用的配置參數,他們將提供:

Ext.define('AM.view.ui.DecoratorAbstract',{ 
    extend: 'Ext.window.Window', 
    alias: 'widget.decoratorAbstract', 

    initComponent: function(){ 
     this.callParent(arguments); 
    } 
}); 

Ext.define('AM.view.ui.DecoratorForm',{ 
    extend: 'AM.view.ui.DecoratorAbstract', 
    alias: 'widget.decoratorForm', 

    initComponent: function(){ 
     this.buttons = [ 
      { text:'Guardar', action:'save', iconCls: 'ico-save' }, 
      { text:'Cancelar', action:'cancel', iconCls: 'ico-cancel' } 
     ]; 
     this.callParent(); 
    } 
}); 

//to instantiate: 
Ext.create('AM.view.ui.DecoratorForm',{ 
    resizable: true, 
    closable: true, 
    minimizable: true, 
    title: 'Title' 
}).show(); 

每當你嘗試通過使用類似cfg的數組來「欺騙」組件,你應該重新考慮你正在做什麼,看看是否有更聰明的方法。

你應該考慮的另一件事是Ext.apply()。通過將之前的內容更改爲如下形式,可節省大量字節:

Ext.apply(this, { 
    title: 'my title', 
    resizable: cfg[0], 
    closable: cfg[1], 
    ///...etc... 
}) 
相關問題