2011-05-12 9 views
11

En mi proyecto actual, estoy utilizando ExtJs3.3.
He creado muchas clases que tenían variables privadas y funciones. Por ejemplo:Funciones privadas y variables ExtJs4?

MyPanel = function(config){ 
    config = config || {}; 

    var bar = 'bar';//private variable 

    function getBar(){//public function 
    return bar; 
    } 

    function foo(){ 
    //private function 
    } 

Ext.apply(config, { 
    title: 'Panel', 
    layout: 'border', 
    id: 'myPanel', 
    closable: 'true', 
    items: [] 
}); 

    MyPanel.superclass.constructor.call(this, config); 
}; 
Ext.extend(MyPanel , Ext.Panel, { 
    bar: getBar 
}); 
Ext.reg('MyPanel', MyPanel); 

entiendo que la nueva forma de hacer las cosas en ExtJs4 es utilizar el método Ext.define. Así como mi pieza de código anterior sería algo como esto:

Ext.define('MyPanel', { 
    extend: 'Ext.panel.Panel', 

    title: 'Panel', 
    layout: 'border', 
    closable: true, 

    constructor: function(config) { 

    this.callParent(arguments); 
    }, 

}); 

Así que lo que quiero saber es cómo puedo definir variables privadas y funciones en ExtJs4 similares a la forma en que lo he hecho en ExtJs3?
En otras palabras, entiendo que el método Ext.define se encargará de definir, extender y registrar mi nueva clase, pero ¿dónde debo declarar javascript var que no son propiedades de la clase pero son necesarias para la clase.

MyPanel = function(config){ 
    //In my Ext3.3 examples I was able to declare any javascript functions and vars here. 
    //In what way should I accomplish this in ExtJs4. 

    var store = new Ext.data.Store(); 

    function foo(){ 
    } 
    MyPanel.superclass.constructor.call(this, config); 
}; 

Respuesta

8

No soy un gran fan de imponer variables privadas como esta, pero por supuesto se puede hacer. Acaba de configurar una función de acceso (cierre) a la variable en su constructor/función InitComponent:

constructor: function(config) { 
    var bar = 4; 
    this.callParent(arguments); 

    this.getBar = function() { 
     return bar; 
    } 
},... 
+0

¿Puede ampliar esta @ Rob? No recibo mucho apoyo en [los foros de Sencha] (http://www.sencha.com/forum/showthread.php?245130-Understanding-Ext-JS-4). Espero encontrar algo similar a mi implementación (ver la actualización de la pregunta realizada el 2012-05-31) -> http://stackoverflow.com/questions/9104387/extjs-javascript-module-design-pattern-best-practices – blong

+0

Hola, estoy de acuerdo con el comentario a continuación de que el uso del objeto de configuración sería lo que desea al usar ExtJS 4 o Sencha Touch 2. La configuración crea variables internas y un getter y setter automáticamente. Los llamo "variables internas" porque no son exactamente "privados". Al excavar en el objeto podrá cambiarlos, pero debe esforzarse :) Cuando esté creando cualquier aplicación compleja, le recomendaría ENCARECIDAMENTE utilizar la estructura de Sencha MVC en lugar de las definiciones manuales para la mantenibilidad. Buena suerte –

+0

¿qué tal algo así: http://stackoverflow.com/a/6023603/320399. Estoy intentando adaptar 'Ext.define' para darme funciones privadas compartidas entre instancias y variables de miembros privados exclusivas de las instancias. – blong

6

Eso es exactamente lo config es para, mira esto desde docs ExtJs:

config: Objeto lista de opciones de configuración con sus valores predeterminados, para los cuales se generan automáticamente métodos de acceso. Por ejemplo:

Ext.define('SmartPhone', { 
    config: { 
     hasTouchScreen: false, 
     operatingSystem: 'Other', 
     price: 500 
    }, 
    constructor: function(cfg) { 
     this.initConfig(cfg); 
    } 
}); 

var iPhone = new SmartPhone({ 
    hasTouchScreen: true, 
    operatingSystem: 'iOS' 
}); 

iPhone.getPrice(); // 500; 
iPhone.getOperatingSystem(); // 'iOS' 
iPhone.getHasTouchScreen(); // true; 
iPhone.hasTouchScreen(); // true 

De esta manera puede ocultar su campo real y seguir teniendo acceso a él.

+1

Esto también creará un método 'apply' y' setter'. Igual deberás anular el método de aplicar y devolver el vacío para asegurarte de que ppl no puede cambiar el valor. –

5

Puede crear miembros privados como este. Pero no será útil si está haciendo más de una instancia para esta clase.

Ext.define('MyPanel', function(){ 

    var bar = 'bar';//private variable 

    function foo(){ 
     //private function 
    }; 
    return { 
     extend: 'Ext.panel.Panel', 
     title: 'Panel', 
     layout: 'border', 
     closable: true, 

     constructor: function(config) { 

      this.callParent(arguments); 
     }, 

     getBar: function(){//public function 
      return bar; 
     } 

    }; 

}); 

gracias,

Nandu

+0

'bar' y' foo', en su código, son en realidad variable estática y función respectivamente. – Arvin

+0

¿Sospecho que te falta '()' después del cuerpo de la función? – Alex

Cuestiones relacionadas