JavaScriptでオブザーバーを書きました。次のようにイベントをトリガーできます。
ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn)
可変数の引数があり、最初の引数はイベント名です。イベントクラスのプライベートプロパティに保存されているサブスクライバーも持っています。それらは次のように呼び出されます。
Event.prototype.triggerEvent = function() {
var callbacks = this._events[eventName];
if(callbacks !== undefined) {
for (var i = 0, l = callbacks.length; i < l; i++) {
// I do not need the first argument here!!!
callbacks[i].apply(callbacks[i], arguments);
}
}
}
ただし、サブスクライバーはイベント名を知っているため、省略することができます。しかし、リストから1つの引数を削除する方法がわかりません(配列ではなく、ある種のオブジェクトのように見えるため)。
また、イベント名が削除されたら、再度追加する必要があります。これは、直接のサブスクライバーに通知した後、グローバル イベント システムが作動するためです。このグローバル イベント システムには名前が必要です。
したがって、関数全体は次のようになります。
Event.prototype.triggerEvent = function() {
// First we deliver to direct subscribers
var callbacks = this._events[eventName];
if(callbacks !== undefined) {
for (var i = 0, l = callbacks.length; i < l; i++) {
// I do NOT need the first argument here!!!
callbacks[i].apply(callbacks[i], arguments);
}
}
// Now we broadcast the event to the entire system
// I DO need the first argument here!!!
Facade.getInstance().broadcastEvent.apply(Facade.getInstance(), arguments);
}
これをどのように実装しますか?