2011-02-08 13 views
5

Ho una domanda riguardante l'ereditarietà multipla in ExtJS. Mentre so che posso semplicemente duplicare il codice per farlo accadere, ma voglio sapere se c'è un modo per codificarlo in modo più efficiente.Extjs ereditarietà multipla?

Ho un componente personalizzato GridPanel nel mio framework, chiamato Kore.ux.grid.GridPanel. Estende Ext.GridPanel con funzionalità aggiuntive comuni e fornisce un'interfaccia per le azioni REST.

Poco dopo, il mio collega voleva che anche lo EditorGridPanel fosse implementato nello stesso modo, cioè voleva che fosse modificabile e, allo stesso tempo, fosse in grado di eseguire facilmente azioni di REST.

La mia domanda è, c'è un modo per estendere lo Ext.EditorGridPanel per attivare le funzionalità personalizzate Kore.ux.grid.GridPanel?

Ci scusiamo per eventuali errori grammaticali e posso riformularlo se è confuso. Grazie!!

EDIT

I Googled di nuovo, e ho trovato le discussioni dicendo che è impossibile. C'è un modello di codifica migliore che dovrei seguire se ho questo problema?

Grazie!

modificare nuovamente

Mi dispiace tanto ho trovato la struttura che si adatta a me .. Qui è il metodo che ho trovato utile per me:

var Common = function(){} //abstract class 
Ext.apply(Common.prototype, { 

    a : function(){}, 
    b: function(){}... 

}); 

Ext.ux.SomePanelA = Ext.extend (Ext.Panel, { 

    stuff : ............ 

}); 

Ext.ux.SomePanelB = Ext.extend (Ext.Panel, { 

    diffStuff : ............ 

}); 

Ext.applyIf(Ext.ux.SomePanelA.prototype, Common.prototype); 
Ext.apply(Ext.ux.SomePanelB.prototype, Common.prototype); 

Source Code: http://www.sencha.com/forum/showthread.php?48000-multiple-inheritance&p=228271&viewfull=1#post228271

di nuovo Si prega di fornire suggerimenti utili se pensi di avere una soluzione migliore :) Grazie!

risposta

5

Ciò di cui si ha veramente bisogno di esaminare, sono i plugin ExtJS.

/** 
* Boilerplate code taken from 'ExtJS in Action' by Jay Garcia 
*/ 
YourNameSpace.RestGridPlugin = Ext.extend(Object, { 
    constructor : function(config) { 
    config = config || {}; 
    Ext.apply(this.config); 
    }, 

    init : function(parent) { //parent argument here, is whatever you apply your plugin to 
    parent.on('destroy', this.onDestroy, this); 
    Ext.apply(parent, this.parentOverrides); 
    }, 

    onDestroy : function() { 
    //here you need to free any resources created by this plugin 
    }, 

    parentOverrides : { 
    //here you do your magic (add functionality to GridPanel) 
    } 

}); 

Ext.preg('restgridplugin',YourNameSpace.RestGridPlugin); //register your brand ne plugin 

Uso

someGrid = { 
    xtype: 'grid', 
    columns: ... 
    store: ... 
    plugins: [ 
    'restgridplugin' 
    ] 
} 

someEditorGrid = { 
    xtype: 'editorgrid', 
    columns: ... 
    store: ... 
    plugins: [ 
    'restgridplugin' 
    ] 
} 
+0

PLUGIN! Perché dimentico la sua esistenza !! Grazie per il suggerimento :) Vedremo come lo incorporo nel framework.Grazie :) –

+0

Ma questo potrebbe non essere adatto al mio caso in quanto il mio GridPanel personalizzato fornisce pagingToolbar personalizzato, pulsanti predefiniti, casella di ricerca, REST ... ecc. Il plugin potrebbe non essere il modo :) Grazie per il suggerimento comunque! –

+0

Perché no? È possibile accedere a questi componenti personalizzati dal plug-in per associare loro le funzionalità. Dopotutto, ciò che fa il plugin è in effetti 'Ext.apply()' proprio come lo si fa ora. Aggiunge solo un po 'più robusto e facile da usare API per questo. – Mchl

0

Creare Kore.ux.grid.AbstractGridPanel come classe base con funzionalità generale. E creare due classi figlio: Kore.ux.grid.GridPanel e Kore.ux.grid.EditorGridPanel (con funzionalità specifiche).

+0

Il fatto è che, 'Ext.grid.EditorGridPanel' estende' Ext.grid.GridPanel', il resto "l'interfaccia" che ho fornito sta estendendo 'Ext.grid.GridPanel', e poiché ho bisogno di funzionalità fornite in' Ext.grid.EditorGridPanel', penso che il modo migliore sia scrivere una classe base comune ed estendere entrambi 'Ext.grid .GridPanel' e 'Ext.grid.EditorGridPanel' con la classe base comune. Grazie per l'input comunque :) –

0

non sono d'accordo con l'utilizzo di plugin per raggiungere l'ereditarietà multipla in Ext. I plugin hanno lo scopo di modificare il comportamento o aggiungere nuove funzionalità.

Il modo giusto per raggiungere l'ereditarietà multipla è quello di utilizzare mixin, ti invitiamo a guardare questo incredibile spiegazione SenchaCon 2011: The Sencha Class System

Ext.define('FunctionalityA', { 
    methodA: function() { 
     ... 
    } 
}); 

Ext.define('FunctionalityB', { 
    methodB: function() { 

    } 
}); 

Ext.define('MultipleFunctionality', { 
    mixins: [ 
     'FunctionalityA', 
     'FunctionalityB' 
    ], 

    method: function() { 
     methodA(); 
     methodB(); 
    } 
}); 
Problemi correlati