私は、観察者が対象で発生したイベントの特定のセットを気にオブザーバーパターンを次のオブジェクトの関係を記述しようとしています。Observer Patternの質問 - JavaScript配列自体が親配列から削除されていますか?
は、私は、これは100%の標準であるかどうかわからないんだけど、私はそれを構築してきた方法は、これらのイベントオブジェクトは、イベントが発生したときに発生しますカスタムコールバックで、観測者内で定義されています。被験者にイベントが発生すると、それはオブザーバーのすべてを通過し、このイベントを誰が見ているかを調べます。オブザーバーがこのイベントを監視している場合、オブザーバーイベントのコールバックをトリガーします。
私のオブザーバーは、監視するイベントを追加したり削除したりするのに柔軟性を持たせたいので、コールバックを実行した後でイベントオブジェクトを削除する必要があります。たとえば、私のオブザーバーがイベントに一度だけ応答したい場合は、それを監視しません。
これは良い計画のように思えるが、私は自分自身に()JavaScriptオブジェクトは、呼び出しは削除することはできませんことを知っています。
私はそこに誰がこのに走っていたされており、効果的な解決策を考え出すていただけに興味がありました。
親オブザーバオブジェクトへの参照を子イベントに渡すことができ、コールバックが発生したときに、親内のメソッドを呼び出すことができました。removeEvent(this)
この関数。 removeEvent関数は、イベントの配列からイベントをスプライスすることができます。唯一の複雑な問題は、配列内のこのイベントオブジェクトの場所を見つけることだけです。 (これについての提案もありがとう!)。
ありがとうございました!
私はこれが好きですが、サブジェクトの "notify"ループ内から "detach"を呼び出すリスナーに対して守りたいかもしれません。 for/loop中に変更されている「オブザーバー」の長さは問題です。これを解決する方法はたくさんあります。 – selbie
はい、デモです。プロダクションのためにいくつかの強化をしたいと思っています。良い点tho :) – meouw
セルビーのコメントごとに通知ループの問題を修正しました。私たちはループしている配列をループ中に変更したくない – meouw