2011-07-29 23 views
23

Escribo todos mis componentes en la nueva MVC de ExtJS usando Ext.define().Mejores prácticas sobre initComponent() en Ext.define()

Lucho un poco si define las propiedades dentro de initComponent() o simplemente configurándolas como property: 42,.

¿Existen buenas prácticas ampliamente aceptadas?

estoy escalonamiento entre el uso de initComponent() sólo cuando sea necesario (es decir. Cuando quiero algo dinámico o establecer un ámbito) que mantiene la función más corto y me ahorra algunos feos this. s y su uso siempre que tiene la ventaja, de que me Nunca tendré que mover propiedades anteriores a initComponent() solo porque quiero que sea más dinámico.

Desafortunadamente, los documentos de Sencha no dicen mucho sobre eso y los ejemplos disponibles parecen hacer lo que quieren.

Respuesta

18

la práctica personal, voy a declarar variables en el área de propiedades cuando las variables

  • definir magnitud, como x, y, width, height
  • variables que espera a ser anulado, o personalizable , como title, saveBtnTxt, url, fields, iconCls
  • algunas constantes, que tendrán prefijos especiales por lo que no serán anulados tan fácilmente

entonces les declararé items, listeners, this.on, Ext.apply(me, {..}) o cualquier cosa que requiere el alcance de la obj (this, me), para sentarse dentro de mi initComponent. O cosas que deberían modificarse/anularse antes de que todo se configure para que el usuario no rompa mi componente anulando algunas de las variables importantes.

Por supuesto que me servirá de guía. 2 centavos

EDIT

Sobre la fea this, he utilizado la variable me ampliamente en mi aplicación, y se ve mucho más limpio que this. Me beneficia cambiar los ámbitos también con menos frecuencia.

+0

De acuerdo, ese sería mi enfoque actual. Simplemente se volvió tedioso cuando ciertas propiedades mágicamente se volvieron dinámicas, es por eso que estoy preguntando. Todavía no sabía nada de 'me' ... Soy bastante nuevo en ExtJS. – hynek

+0

No hay magia aquí. Simplemente revisa su código fuente, verás un montón de "yo" volando. 'yo' es solo una referencia al objeto 'esto' en realidad. –

+0

La magia se refería a mi propio código, cuando cambié de opinión e hice una propiedad dinámica. Debido a la falta de tutoriales ExtJS 4 sólidos cuando comencé, mi aplicación se ensució un poco (es decir, estilo 3.2) y tuve que volver a escribir mucho para que sea MVCey. Eso condujo a muchas propiedades de extracción dentro de 'initComponent()' que fue un poco tedioso. Entonces, ¿hay alguna diferencia entre 'me' y' this' además del hecho de que es más corta? – hynek

-1

No recibo su pregunta exactamente pero esto puede ser útil para usted.

Ext.define('My.Group', { 
// extend: 'Ext.form.FieldSet', 
xtype : 'fieldset', 
config : { 
    title : 'Group' + i.toString(), 
    id : '_group-' + i.toString() 

}, 
constructor : function(config) { 
    this.initConfig(config); 

    return this; 
},  
collapsible: true, 
autoScroll:true, 
..... 
}); 

puede usarlo de la siguiente manera.

handler : function() {      
     i = i + 1; 
     var group = new My.Group({ 
      title : 'Group' + i.toString(), 
      id : '_group-' + i.toString() 
     }); 
     // console.log(this); 
     // console.log(group); 
     Ext.getCmp('panelid').insert(i, group); 
     Ext.getCmp('panelid').doLayout(); 
    } 
+3

No recibo exactamente su respuesta, pero este comentario tampoco está relacionado: me gustan los semáforos – Mchl

+1

sí ... Está pidiendo opinión, supongo :) –

+1

Lo siento, pero su respuesta ni siquiera contiene un 'initComponent() '. :) Pero los semáforos son increíbles. – hynek

11

Quiero agregar a la respuesta de Lionel que es mejor declarar configuración no primitiva en initComponent. (Por primitivo quiero decir cadena, booleano y número). Array y Object entran en initComponent.
Así definición debería tener este aspecto:

Ext.define('My.NewClass', { 
    extend: 'OldClass', 
    // here all primitive configs: 
    cls: 'x-my-cls', 
    collapsible: true, 
    region: 'west', 
    // and so on ... 

    initComponent: function() { 
    // here you declare non-primitive configs: 
    this.tbar = [/* blah-blah */]; 
    this.columns = [/* blah-blah */]; 
    this.viewConfig = {/* blah-blah */}; 
    // and so on ... 

    this.callParent(arguments); 
    } 

    // other stuff 
} 

La razón por la que debe poner todas las configuraciones no primitivos en InitComponent es que de lo contrario configuraciones de todos los casos se refieren a los mismos objetos. Por ejemplo, si define como NewClass:

Ext.define('My.NewClass', { 
    extend: 'OldClass', 
    bbar: Ext.create('Ext.toolbar.Toolbar', { 
    // ... 

bbar s de todos los casos se refieren al mismo objeto. Y, por lo tanto, cada vez que crea una nueva instancia, bbar desaparece de la instancia precedente.

+1

Aunque estoy de acuerdo contigo, creo que esta respuesta podría ser un poco engañosa. Según tengo entendido, si en lugar de crear una instancia, se usa xtype (es decir, la configuración del objeto), no se compartirá. Por lo tanto, al menos en ExtJS 4, no debería existir un problema al tener objetos y matrices como propiedades de configuración (en comparación con el uso de InitComponent). Por supuesto, si necesita acceder a esto o su clase puede ser anulada por otros o necesita fusionar configuraciones, se utilizará InitComponent. Para obtener más información, consulte: http://skirtlesden.com/articles/config-objects-on-the-prototype – Izhaki

+0

¿Qué sucede si lo coloca dentro de un bloque "config {}"? – HDave

+0

una pregunta tonta, supongo, pero me gustaría saber qué son no premite en extjs? Sé que el objeto de matrices, etc., pero en cuanto al concepto, siempre me confundo para diferenciarme al crear una aplicación en extjs 5. ¿Daña el rendimiento si no estoy usando 'initComponent()' ?? Soy un nuevo en extjs btw. Gracias – agpt