【问题标题】:ExtJs 4 callbacksExtJs 4 回调
【发布时间】:2012-09-03 19:43:37
【问题描述】:

我很难找出我的作业丢失的原因,并发现回调范围与我想象的不同。

我所做的是在控制器中创建一个变量,然后尝试将回调传递给控制器​​创建的窗口,然后在该窗口上的事件上回调控制器中的函数。

例如,在我的控制器中,我有:

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”。

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

【问题讨论】:

    标签: javascript extjs extjs4 extjs4.1 extjs4.2


    【解决方案1】:

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

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

    【讨论】:

    • @leonardorame 是的。您的函数在窗口范围内执行,并且您应用控制器实例作为参考。我的函数在控制器范围内执行,因此您可以使用“this”例如。 [data] 是参数数组
    • 我删除了我的最后一条评论,因为我没有看到 Ext.callback 调用。我会把你的标记为正确答案。谢谢。
    • @leonardorame 如果需要带范围的回调,您没有那么多方法。另一个变体是Ext.isFunction(myFunc) && myFunc.apply(this, [arg1, arg2]);,但与Ext.callback几乎相同
    • @leonardorame 我明白了。所以在不使用 Ext.callback 包装器的情况下采用最后一种方式
    猜你喜欢
    • 2013-02-14
    • 2018-12-19
    • 2012-02-09
    • 1970-01-01
    • 2012-02-20
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多