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

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

如您所见,在“doSomething”函数中,我分配了控制器 var myData,其值由窗口的控制器传递。最初我认为“doSomething”的范围是调用者控制器,但它是窗口的控制器,这就是为什么 useTheData 给出错误说 this.myData 为空。

我通过传递一个名为“caller:this”的新参数解决了这个问题,在doSomething中,接收该参数,并使用它而不是“this”。

问题是,是否有一种简单(步骤更少)的方法来做到这一点?

4

1 回答 1

6

您需要将回调范围应用于窗口并使用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]);
}

这是一种方式,您的解决方案是另一种方式,还有更多。

于 2012-09-03T20:07:21.663 回答