2014-07-10 121 views
2

我有一個窗口組件,我正在擴展以創建不同的窗口。現在,close()hide()偵聽器函數在主板上是相同的,但afterrender()隨每個實例而變化。Extjs:覆蓋特定聽衆

所以我有這樣的:

Ext.define('abc.xyz.BaseWindow', { 
    extend : "Ext.Window", 
    listeners: { 
     hide: function(el, eOpts){ 
      console.log('hide'); 
     }, 
     close: function(el, eOpts){ 
      console.log('close'); 
     } 
    } 
}); 

和:

Ext.define('abc.xyz.MyWindow', { 
     extend : "abc.xyz.BaseWindow", 
     listeners: { 
      afterrender: function(el, eOpts){ 
       console.log('afterrender'); 
      } 
     } 
    }); 

然而,整個listeners對象無效,hide()close()永遠不會被調用。除了在每個擴展窗口中指定hide()close()之外,是否有解決此問題的方法?

回答

5

您可以在窗口中定義的功能,打電話給他們,在這樣的窗口覆蓋它們:

Ext.define('abc.xyz.BaseWindow', { 
    extend : "Ext.Window", 
    onHide: function(){ 
     console.log('hide'); 
    }, 
    onShow: function(el, eOpts){ 
     console.log('close'); 
    }, 
    onAfterRender: function(el, eOpts){ 
     console.log('first after render'); 
    }, 

    initComponent: function() { 
     var me = this; 

     Ext.applyIf(me, { 
      listeners: { 
       hide: me.onHide, 
       show: me.onShow 
       afterrender: me.onAfterRender 
      } 
     }); 

     me.callParent(arguments); 
    } 
}); 

和:

Ext.define('abc.xyz.MyWindow', { 
    extend : "abc.xyz.BaseWindow", 
    onAfterRender: function(el, eOpts){ 
     console.log('second after render'); 
    } 
}); 

或者,如果你沒有在一個AfterRender你只需添加一個監聽器的基類,就像Evan Trimboli sais

Ext.define('abc.xyz.MyWindow', { 
    extend : "abc.xyz.BaseWindow", 
    initComponent: function() { 
     var me = this; 
     me.callParent(arguments); 

     me.on('afterrender', function(el, eOpts){ 
      console.log('second after render'); 
     }); 
    } 
}); 
+3

你最好直接調用'on' t點。 –

+0

在這種情況下是的。但如果你在基類中有一個處理程序將被調用。取決於你想要的:覆蓋或添加額外的監聽器:) – VDP

+0

感謝您的想法。我最終調用'onAfterRender()'從基地的監聽器配置並在擴展窗口中指定函數。有用。不需要initComponent或applyIf – Snowman