我在嵌套函数中使用scope
时遇到问题。我的代码如下,代码中也说明了错误。如何将scope
传递给嵌套函数?
this.store_1.load({
params :{start:0, limit:20},
callback: function(records, operation, success)
{
this.store_2.load({
params : {argID: argID},
callback : function(records, operation, success) {
var my_data = this.store_2.data.items[0].data;
this.my_rowExpander = new Ext.ux.grid.RowExpander({
tpl : new Ext.Template(template_str)
});
this.MyDetailGraph = this.getMyGraph(graphDataArr);
this.MyDetailSummaryPanel = new Ext.Panel({
html : this.getMyDetailSummary_Template(arg1, arg2, arg3),
title : 'Title'
});
this.myPagingBBar = new Ext.PagingToolbar({
pageSize : 20,
buttonAlign : 'center',
store : this.store_1,
doRefresh : function(){
this.store.load({ // if I use this.store_1.load gives error this.store_1 is undefined
params :{start:0, limit:20},
callback: function(records, operation, success)
{
// here gives error --> this.updateDetailGraphValue is not a function
this.updateDetailGraphValue(arg1, this.MyDetailGraph, arg2);
// here must be an error like above
this.updateDetailSummaryPanelValue(this.MyDetailSummaryPanel, arg1, arg2, arg3);
}
});
}
});
this.MyDetailGrid = new Ext.grid.GridPanel({
store : this.store_1,
bbar : this.myPagingBBar,
plugins : this.my_rowExpander,
columns :[
this.my_rowExpander,
{header: 'header1'},
{header: 'header2'},
{header: 'header3'},
{header: 'header4'}
]
});
argPanel.items.insert(0, this.MyDetailGraph);
argPanel.items.insert(1, this.MyDetailSummaryPanel);
argPanel.items.insert(2, this.MyDetailGrid);
argPanel.doLayout();
},
scope : this
});
},
scope : this
});
this.updateDetailGraphValue = function(argMainPanel, argGraph, argDataArray)
{
this.graph = this.getDetailGraph(argDataArray);
argMainPanel.remove(argGraph, true);
argMainPanel.items.insert(0, this.graph);
argMainPanel.doLayout();
};
this.updateDetailSummaryPanelValue = function(argPanel, arg1, arg2, arg3)
{
argPanel.update(this.getDetailSummary_Template(arg1, arg2, arg3));
argPanel.doLayout();
};
答案 0 :(得分:2)
尝试以下代码。但我不知道它会起作用。您还没有为回调中的最后一个回调定义,并且您一直在使用任何范围this
。你最终遇到范围问题只是时间问题。考虑将this
映射到me
等本地变量。
this.store_1.load({
params :{start:0, limit:20},
scope: this,
callback: function(records, operation, success)
{
this.store_2.load({
params : {argID: argID},
scope: this,
callback : function(records, operation, success) {
var my_data = this.store_2.data.items[0].data;
this.my_rowExpander = new Ext.ux.grid.RowExpander({
tpl : new Ext.Template(template_str)
});
this.MyDetailGraph = this.getMyGraph(graphDataArr);
this.MyDetailSummaryPanel = new Ext.Panel({
html : this.getMyDetailSummary_Template(arg1, arg2, arg3),
title : 'Title'
});
function innerCB(records, operation, success) {
// here gives error --> this.updateDetailGraphValue is not a function
this.updateDetailGraphValue(arg1, this.MyDetailGraph, arg2);
// here must be an error like above
this.updateDetailSummaryPanelValue(this.MyDetailSummaryPanel, arg1, arg2, arg3);
}
this.myPagingBBar = new Ext.PagingToolbar({
pageSize : 20,
buttonAlign : 'center',
store : this.store_1,
doRefresh : function(){
this.store.load({ // if I use this.store_1.load gives error this.store_1 is undefined
params :{start:0, limit:20},
scope: this,
callback: innerCB
});
}
});
this.MyDetailGrid = new Ext.grid.GridPanel({
store : this.store_1,
bbar : this.myPagingBBar,
plugins : this.my_rowExpander,
columns :[
this.my_rowExpander,
{header: 'header1'},
{header: 'header2'},
{header: 'header3'},
{header: 'header4'}
]
});
argPanel.items.insert(0, this.MyDetailGraph);
argPanel.items.insert(1, this.MyDetailSummaryPanel);
argPanel.items.insert(2, this.MyDetailGrid);
argPanel.doLayout();
}
});
}
});
this.updateDetailGraphValue = function(argMainPanel, argGraph, argDataArray)
{
this.graph = this.getDetailGraph(argDataArray);
argMainPanel.remove(argGraph, true);
argMainPanel.items.insert(0, this.graph);
argMainPanel.doLayout();
};
this.updateDetailSummaryPanelValue = function(argPanel, arg1, arg2, arg3)
{
argPanel.update(this.getDetailSummary_Template(arg1, arg2, arg3));
argPanel.doLayout();
};
答案 1 :(得分:1)
我在第一次加载时使用了this
,我定义了一个myGlobalScope
的全局范围,然后我在其他范围内使用了myGlobalScope
:
this.store_1.load({
params :{start:0, limit:20},
scope: this,
callback: function(records, operation, success)
{
var myGlobalScope = this; // I have defined this global scope
this.store_2.load({
params : {argID: argID},
scope : myGlobalScope, // use myGlobalScope instead of this
callback : function(records, operation, success) {
var my_data = this.store_2.data.items[0].data;
this.my_rowExpander = new Ext.ux.grid.RowExpander({
tpl : new Ext.Template(template_str)
});
this.MyDetailGraph = this.getMyGraph(graphDataArr);
this.MyDetailSummaryPanel = new Ext.Panel({
html : myGlobalScope.getMyDetailSummary_Template(arg1, arg2, arg3), // use myGlobalScope instead of this
title : 'Title'
});
this.myPagingBBar = new Ext.PagingToolbar({
pageSize : 20,
buttonAlign : 'center',
store : this.store_1,
doRefresh : function(){
this.store.load({ // if I use this.store_1.load gives error this.store_1 is undefined
params :{start:0, limit:20},
scope : this,
callback: function innerCB(records, operation, success) {
myGlobalScope.updateDetailGraphValue(arg1, this.MyDetailGraph, arg2); // use myGlobalScope instead of this
myGlobalScope.updateDetailSummaryPanelValue(this.MyDetailSummaryPanel, arg1, arg2, arg3); // use myGlobalScope instead of this
}
});
}
});
this.MyDetailGrid = new Ext.grid.GridPanel({
store : this.store_1,
bbar : this.myPagingBBar,
plugins : this.my_rowExpander,
columns :[
this.my_rowExpander,
{header: 'header1'},
{header: 'header2'},
{header: 'header3'},
{header: 'header4'}
]
});
argPanel.items.insert(0, this.MyDetailGraph);
argPanel.items.insert(1, this.MyDetailSummaryPanel);
argPanel.items.insert(2, this.MyDetailGrid);
argPanel.doLayout();
}
});
}
});
this.updateDetailGraphValue = function(argMainPanel, argGraph, argDataArray)
{
this.graph = this.getDetailGraph(argDataArray);
argMainPanel.remove(argGraph, true);
argMainPanel.items.insert(0, this.graph);
argMainPanel.doLayout();
};
this.updateDetailSummaryPanelValue = function(argPanel, arg1, arg2, arg3)
{
argPanel.update(this.getDetailSummary_Template(arg1, arg2, arg3));
argPanel.doLayout();
};