2010-07-03 13 views
22

In extjs è sempre possibile estendere una classe extjs tramite constructor(). Per le classi che vanno da Component puoi estendere anche tramite initComponent().Extjs: estendere la classe tramite costruttore o initComponent?

Mi chiedo perché così tanti codici si estendono via initComponent, mentre constructor sembra essere il metodo di estensione universale. Lo initComponent offre un netto vantaggio rispetto a constructor?

risposta

17

Prima di tutto, la possibilità di eseguire l'override tramite constructor è stata aggiunta in una versione successiva di Ext di initComponent, quindi tutto il codice di una certa età dovrebbe utilizzare initComponent. In questi giorni, si continuerà a sovrascrivere initComponent se si desidera eseguire qualsiasi operazione dopo la classe base initComponent viene chiamata (il costruttore sarebbe troppo presto per questo), ma prima del il componente viene visualizzato. In molti casi (come il più comune, l'installazione di configurazioni), non importa praticamente in alcun modo e la maggior parte delle persone fa ciò che è più conveniente. Tuttavia, ci sono alcuni casi in cui è importante.

+0

Ok, per impostazione predefinita utilizzerò il costruttore come metodo di estensione. Quando ho bisogno di sovrascrivere tramite initComponent, è un segno che sono (troppo) intimo con gli interni della classe. –

+1

Ho trovato anche questo molto utile: http://www.sencha.com/forum/showthread.php?139162-clarification-about-initComponent-constructor-callParent –

+1

I down-modded questo perché il responder è uno dei sviluppatori originali di ExtJS, ma tuttavia conclude la sua risposta con "tuttavia, ci sono alcuni casi in cui è importante" e quindi non ci dice quali. A mio parere, questa non è una risposta alla domanda iniziale - i casi in cui è importante potrebbero offrire una panoramica della query dell'OP "Does initComponent offre chiari vantaggi (s)". –

2

Ecco alcune citazioni rilevanti dal libro di Jay Garcia ExtJS in azione:.

"initComponent viene eseguito all'interno di costruzione della classe Component, ma solo dopo un paio di compiti cruciali di impostazione per la componente hanno avuto luogo Queste attività includono la caching e applicazione delle proprietà dell'oggetto configurazione per l'istanza della classe "

e più tardi, e alla luce della costruzione essendo cui parametri di configurazione vengono applicati al caso:

" se istanze della sottoclasse configurato sarà mai devono essere clonati tramite cloneCo nfig .... quindi l'estensione tramite il costruttore è la scelta migliore. "

A proposito, nonostante il libro di Jay riguardi ExtJS 3, sembra che cloneConfig sia ancora rilevante in ExtJS4; vedi:

http://docs.sencha.com/ext-js/3-4/#!/api/Ext.Component-method-cloneConfig

e

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.Component-method-cloneConfig

10

Vorrei cercare una risposta aggiornata in termini di versioni 4.0-4.2 ExtJS e oltre.

Il constructor() è l'oggetto/classe prima di creare il metodo. E initComponent() è il componente prima di mostrare il metodo.

constructor: function(config) { 
    // ctor #1 - insert code here to modify config or run code to inject config 
    // probably the cheapest place to make changes - before anything has been built 

    this.callParent(arguments); 

    // ctor #2 - insert code here if you need to make changes 
    // after everything has been rendered and shown, IIUC 
}, 
initComponent: function() { 
    // this function runs between ctor #1 and ctor #2 

    // initComponent #1 - the UI component object tree is created, 
    // (this object and child objects from config { items: [{...}]}) 
    // but they have not yet been rendered to DOM or shown. 

    this.callParent(arguments); 

    // initComponent #2 - I believe this is equivalent to ctor #2, 
    // I would prefer ctor as it is more universal. 
} 

pannelli con bambini o il layout complesso avrete probabilmente bisogno di usare initComponent, perché avrete bisogno di controllare e manipolare i componenti (il grafico oggetto dell'interfaccia utente).

Ma per i singoli elementi del modulo (combobox, pulsante, ecc.), Quindi mi attengo al costruttore, che credo sia più leggero (prima di qualsiasi costruzione di oggetti complessi o modifiche DOM) ed è più universale. I costruttori IOW possono essere utilizzati per UI, modelli e archivi dati semplici; gli ultimi due non possono usare initComponent.

Quindi uso solo initComponent quando c'è un motivo per farlo. Spesso quando scrivo una funzione initComponent sto provando a manipolare gli oggetti dell'interfaccia utente figlio, e il mio prossimo passo è quello di estrarre quel controllo figlio nel proprio Ext.define(), lo spostamento del codice personalizzato da eseguire nella classe controllo figlio, che rimuove il complesso init dal pannello genitore. Questo processo l'ho ripetuto 4 volte nella mia ultima pagina.

Problemi correlati