10

サードパーティのフラッシュオブジェクトがあり、それらが提供するjavascriptAPIを介して操作できます。私はこのオブジェクトのイベントをリッスンしてから、オブジェクト内でイベントを発生させて、イベントをさらにバブルアップしようとしています。私はたまたまEXTJを使用していますが、ここではそれが重要だとは思いません。

サンプルコード

this.chart.addEventListener('create', function() {
    this.fireEvent('created');
}, false)

私の問題は、無名関数内の「this」が、イベントを発生させたいオブジェクトではなく、イベントを発生させたオブジェクトを参照していることです。

そのさらに別のスコープの問題。助けてくれてありがとう。

4

3 に答える 3

13

'this'オブジェクトを参照する前に外部変数を作成するのはどうですか。例えば:

var _this = this;
this.chart.addEventListener('create', function() { _this.fireEvent('created'); }, false)
于 2009-11-26T11:42:34.757 に答える
5

this.chart他の回答は必要なことを達成しますが、ビューオブジェクト( )をそのビューのロジック()から最終的に分離しないため、最も効率的な(スケーラブルな)方法では機能しませんfireEvent()。MVCアプリケーションでは、これらのビューの「決定」はコントローラーに存在します。コントローラはビ​​ューを「制御」し、ビューがアクセスできるすべてのAPIを含む必要があります。

あなたの例でthisは、はコントローラーであり、それは問題ありません(つまり、リスナーを適切な場所に追加しているということです)。あなたが本当にする必要があるのは、「処理」を行うべきもののスコープにハンドラーをバインドすることです-あなたの場合this::

// `this` is the controller of `chart`
this.chart.addEventListener('create', function() {
    this.fireEvent('created');
}.bind(this));

このページの他の回答は、ビューが独自のコントローラーになるように作成されていますが、を使用して「コントローラー」に一時的な参照を割り当てることにより、「作成」イベントを処理している間のみvar self = thisです。繰り返しになりますが、これは問題なく機能しますが、イベント駆動型アプリケーションでは大規模にうまく機能せず、処理するイベントがたくさんある場合は実際には意味がありません。

.bind()ECMAScript5の実装です。さらに古いブラウザで動作する必要がある場合は、ここでそのための適切な方法を説明します(functionsおよびを使用.call()):https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

于 2013-03-24T02:20:48.130 に答える
1

これは、この問題への典型的なアプローチです:-

(function(self) {
  self.chart.addEventListener('create', function() {self.fireEvent('created');}, false);
})(this);
于 2009-11-26T12:12:58.283 に答える