leo*_*ame 2 javascript extjs extjs4 extjs4.1 extjs4.2
我很难尝试找出为什么我的分配丢失了,并且发现回调作用域与我想象的不同。
我要做的是在控制器中创建一个变量,然后尝试将回调传递给该控制器创建的窗口,然后在该窗口上的事件上回调该控制器中的函数。
例如,在我的控制器中,我有:
callWindow: function(){
var myWin = Ext.Create('MyApp.view.myWin', {doSomething: this.doSomething});
},
doSomething: function(data){
this.myData = data;
},
useTheData: function(){
console.log(this.myData);
}
Run Code Online (Sandbox Code Playgroud)
在myWin的控制器中,我有一个偶数处理程序以这种方式调用doSomething:
onBtnClick: function(button){
var win = button.up('window');
var data = {id: 1, name: "John"}; // please, don't pay attention to this, it's a record I'm passing to the caller.
win.doSomething(data);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,在“ doSomething”函数中,我为控制器分配了var myData,其值由窗口的控制器传递。最初,我认为“ doSomething”的范围是调用方控制器,但它是窗口的控制器,这就是为什么useTheData给出错误说this.myData为null的原因。
我已经解决了问题,方法是传递一个名为“ caller:this”的新参数,并在doSomething中接收该参数,并使用它代替“ this”。
问题是,有没有一种简单的方法(步骤较少)?
您需要将回调的作用域应用于窗口并使用Ext.callback
callWindow: function(){
var myWin = Ext.Create('MyApp.view.myWin', {doSomething: this.doSomething, scope: this});
},
onBtnClick: function(button){
var win = button.up('window');
var data = {id: 1, name: "John"}; // please, don't pay attention to this, it's a record I'm passing to the caller.
Ext.callback(win.doSomething, win.scope, [data]);
}
Run Code Online (Sandbox Code Playgroud)
这是一种方式,您的解决方案是另一种方式,甚至还有更多。