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 が null であるというエラーを出します。

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

これは 1 つの方法であり、ソリューションは別のものであり、さらに多くの方法があります。

于 2012-09-03T20:07:21.663 に答える