0

コールバック関数の配列を含む静的クラスがあり、この静的クラスと対話するために使用される他のいくつかのクラスがあります...

静的クラスの簡単な例を次に示します。

var SomeStaticInstance = {};
(function(staticInstance) {
    var callbacks = {};
    staticInstance.addCallback = function(callback) { callbacks.push(callback); }
    staticInstance.callAllCallbacks = function() { /* call them all */ }
}(SomeStaticInstance));

次に、それと対話する他のクラスの例を次に示します。

function SomeClassOne() {
    this.addCallbackToStaticInstance = function() { SomeStaticInstance.addCallback(this.someCallback); }
    this.someCallback = function() { /* Do something */ }
    this.activateCallbacks = function() { SomeStaticInstance.callAllCallbacks(); }
}

function SomeClassTwo() {
    this.addCallbackToStaticInstance = function() { SomeStaticInstance.addCallback(this.someOtherCallback); }
    this.someOtherCallback = function() { /* Do something else */ }
    this.activateCallbacks = function() { SomeStaticInstance.callAllCallbacks(); }
}

今私が抱えている問題は、いずれかのクラスを呼び出して activateCallbacks() に指示すると、クラスは独自のスコープ内のコールバックのみをアクティブにすることです。それは閉鎖の範囲と関係がありますが、私が求めている動作を取得する方法がわかりません...

静的クラスを通常のクラスに変換してから、コンストラクターを介して2つのクラスに渡そうとしましたが、それでも同じ問題が発生します...

だから私の質問は、クラスにすべてのコールバックを発生させる方法です

- 編集 -

これは、実際のアプリで発生しているのと同じ問題を示す例です。より明確な例を示すために、すべてのスクリプト コードをページに配置しました。

http://www.grofit.co.uk/other/pubsub-test.html

これは、2 人のプレゼンターと 2 つのビューを備えたシンプルなアプリです... 1 つのビューは、ページの上部にある 2 つの数値を加算することに関係し、2 つ目のビューは、その合計を取得して乗算し、結果を表示することに関係しています。

私が使用しているサードパーティ ライブラリはPubSubJSで、最初のプレゼンターはイベントをリッスンして、ボックスの 1 つが変更されたことを通知し、一番上の行を再合計します。2 番目のプレゼンターは、一番上の乗算または合計がいつ変化するかをリッスンし、一番下のものを再計算します。ただし、最初のプレゼンターは正しく再計算され、2 番目のプレゼンターは乗算ボックスが変更されるたびに正しく再計算されます。通知を受信する必要があるとはいえ、上部の合計が変更されても再計算されません...

とにかく、ページのソースコードをざっと見て、私が何を意味するかを確認してください...

4

2 に答える 2

1

まず、callbacks.push()を使用しているので、var callbacks = [](オブジェクトではなく配列)が必要だと思います。

私はあなたの問題を理解しているかどうかわかりません。クラスの構造化方法では、両方のクラスをインスタンス化し、両方の新しいオブジェクトでaddCallbackToStaticInstance()を呼び出すことで、目的を達成できます。例えば、

var one = new SomeClassOne();
var two = new SomeClassTwo();
one.addCallbackToStaticInstance();
two.addCallbackToStaticInstance();
one.activateCallbacks();

次に、上記のように、いずれかのオブジェクトからactivateCallbacks()を呼び出すことができます。

クラスの1つだけをインスタンス化した後でactivateCallback()を呼び出せるようにしたい場合は、実際にアプローチを再考する必要があります。addCallbackToStaticInstance()とactivateCallbacks()を独自のクラスに移動することから始めます。

于 2011-04-30T10:55:24.050 に答える
0

これは非常に奇妙な方法ですが、主な問題は、コールバックが SomeStaticInstance の一部ではなく、匿名クロージャー内で定義されていることです。また、コールバック オブジェクト{}は配列である必要があり[]ます。

staticInstance.callbacks = [];代わりに試してくださいvar callbacks = {};

staticInstance.addCallback = function(callback) { 
  this.callbacks.push(callback); 
}
于 2011-04-30T10:32:49.747 に答える