类中的一个方法是否可以存储另一个方法以后可以使用的值?
例如,这是我的一个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')或者创建新的函数。是否存在在一次方法调用期间保存变量的机制,然后在另一种方法中使用该变量?
答案 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方法。