2011-05-12 7 views
11

В моем текущем проекте я использую ExtJs3.3.
Я создал много классов, которые имели частные переменные и функции. Для например:Частные функции и переменные 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); 

Я понимаю, что новый способ делать вещи в ExtJs4 является использование метода Ext.define. Так как мое выше фрагмент кода будет выглядеть примерно так:

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

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

    constructor: function(config) { 

    this.callParent(arguments); 
    }, 

}); 

Так что я хочу знать, как я могу определить частные переменные и функции в ExtJs4 аналогично тому, как я сделал это в ExtJs3?
Другими словами, я понимаю, что метод Ext.define позаботится об определении, расширении и регистрации моего нового класса, но где я должен объявить javascript var, которые не являются свойствами самого класса, но необходимы классу.

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); 
}; 

ответ

8

Я не большой поклонник применения таких частных переменных, как это, но, конечно, это можно сделать. Просто установка функции сбруя (закрытие) переменной в конструкторе/функция InitComponent:

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

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

Вы можете расширить эту @Rob? Я не получаю много поддержки на [Sencha Forums] (http://www.sencha.com/forum/showthread.php?245130-Understanding-Ext-JS-4). Я надеюсь найти что-то похожее на мою реализацию (см. Обновление вопроса, сделанное в 2012-05-31) -> http://stackoverflow.com/questions/9104387/extjs-javascript-module-design-pattern-best-practices – blong

+0

Привет, Я согласен с комментарием ниже, что использование объекта конфигурации будет тем, что вы хотите использовать при использовании ExtJS 4 или Sencha Touch 2. Конфигурация автоматически создает внутренние переменные и геттер и сеттер. Я называю их «внутренними переменными», потому что они не совсем «частные». Когда вы копаетесь в объекте, вы сможете их изменить, но вы должны приложить усилия. Когда вы создаете какое-либо сложное приложение, я бы настоятельно рекомендовал использовать структуру Sencha MVC вместо ручных определений для удобства обслуживания. Удачи –

+0

как насчет этого: http://stackoverflow.com/a/6023603/320399. Я пытаюсь адаптировать 'Ext.define', чтобы предоставить мне частные функции, разделяемые между экземплярами и частными переменными-членами, уникальными для экземпляров. – blong

6

Вот именно то, что конфигурация для, проверить это из ExtJS документации:

конфигурации: Object Список опций конфигурации с их значениями по умолчанию, для которых генерируются автоматически методы доступа. Например:

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 

Таким образом, вы скрываете свое фактическое поле и все еще имеете к нему доступ.

+1

Это также создаст метод 'apply' и' setter'. Вам все равно придется переопределить метод apply и вернуть void, чтобы убедиться, что ppl не может изменить значение. –

5

Вы можете создать частных участников, как это. Но это не поможет, если вы делаете более одного экземпляра для этого класса.

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; 
     } 

    }; 

}); 

спасибо,

нанду

+0

'bar' и' foo', в вашем коде, фактически являются статической переменной и функцией соответственно. – Arvin

+0

Я подозреваю, что вам не хватает «()» после тела функции? – Alex

Смежные вопросы