Sencha Touch / ExtJS:如何存储变量供以后使用?

时间:2011-03-07 06:50:34

标签: extjs sencha-touch

类中的一个方法是否可以存储另一个方法以后可以使用的值?

例如,这是我的一个Ext.Panel实例的片段:

app.views.EstablishmentDetail = Ext.extend(Ext.Panel, {
dockedItems: [{
    xtype: 'toolbar',
    title: 'View establishment',
    items: [
        {
            text: 'Back',
            ui: 'back',
            listeners: {
                'tap': function () {
                    Ext.dispatch({
                        controller: app.controllers.establishments,
                        action: 'index',
                        animation: {type:'slide', direction:'right'}
                    });
                }
            }
        },
        {xtype:'spacer'},
        {
            id: 'Map',
            text: 'Map',
            ui: 'action',
            listeners: {
                'tap': function () {
                    Ext.dispatch({
                        controller: app.controllers.establishments,
                        action: 'showMap',
                        id: this.record.getId(),
                        data: this.record.data,
                        record: this.record
                    });
                }
            }
        }
    ]
}],
styleHtmlContent:true,
scroll: 'vertical',

我想在这个类中有一个变量 - 称之为'myVariable',我可以传递给你在上面看到的调度程序中的属性'showMap'。 (我想从另一个方法调用初始化它的值。)

但是在我在ExtJS上看到的所有例子中,当你像Ext.Panel这样的子类时,你似乎只能引用预先存在的属性(比如'title')或者创建新的函数。是否存在在一次方法调用期间保存变量的机制,然后在另一种方法中使用该变量?

2 个答案:

答案 0 :(得分:4)

是的,您可以将所需的任何属性添加到子类中。在你正在做的方法之间共享数据的唯一棘手的事情是this指针指的是项目,而不是子类。

我认为简单的做法是覆盖initComponent方法,以便您可以使用闭包在处理程序之间共享变量,例如:

app.views.EstablishmentDetail = Ext.extend(Ext.Panel, {
initComponent: function () {
    var me = this;  //me will always refer to the view instance
    me.myVariable = yourMethod();
    me.dockedItems = [
        ...same code as you had before {
        listeners: {
            'tap': function () {
                Ext.dispatch({
                    someProp: me.myVariable
                });
            }
        }
    }];

    //You have to remember to do this anytime you override the initComponent method!!!
    app.views.EstablishmentDetail.superclass.initComponent.apply(this, arguments);
}});

恕我直言,无论何时你在你的子类中使用this指针,如果你将你的代码移动到initComponent并使用闭包,那就不那么容易混淆了。你不必这么做,但是你必须向上/向下移动父/子组件链。

希望这有帮助

答案 1 :(得分:1)

将varibles放在类上的好方法是使用Ext.apply方法。

Ext.apply(this, {
myVar1 : myVar1,
myProp1: myProp1,
})

Dispatch调用中不存在varible的原因是它不在正确的范围内。在这种情况下,侦听器函数的默认范围是工具栏。您必须在侦听器上将范围设置为this。

要回答您的问题,您可以执行以下操作:

initComponent: function(){
    Ext.apply(this, {
    dispatchAction : 'showMap'
    });
    app.views.EstablishmentDetail.superclass.initComponent.call(this);
}

...

listeners: {
                tap:{
                    fn : function () {
                    Ext.dispatch({
                        controller: app.controllers.establishments,
                        action: this.dispatchAction,
                        id: this.record.getId(),
                        data: this.record.data,
                        record: this.record
                    });
                }
                scope: this
            }
        }

有许多有效的方法可以使用侦听器对象,这是其中之一。我更喜欢使用on / addListener方法。