2010-02-13 13 views
6

Hey ... Flash'ı çok kullanıyorum ve sınıflarım, bir sınıfın özel olaylarını tanımlamamı sağlayan EventDispatcher sınıfını kullanıyor. Bunu javascript’te nasıl yapabilirim.Javascript dispatchEvent

var MyClass = function() { 
}; 
MyClass.prototype = { 
    test : function() { 
    dispatchEvent('ON_TEST'); 
    } 
}; 

var mc = new MyClass(); 
mc.addEventListener('ON_TEST', handler); 
function handler() { alert('working...') } 

Nasıl JavaScript ile bu posible:

Böyle bir şey yapmak istersiniz?

cevap

20

Kendi rulonuzu yuvarlayın. İşte sadece bir yol.

var MyClass = function() { 
    this._events = {}; 
}; 
MyClass.prototype = { 
    addListener: function(eventName, callback) { 
     var events = this._events, 
      callbacks = events[eventName] = events[eventName] || []; 
     callbacks.push(callback); 
    }, 
    raiseEvent: function(eventName, args) { 
     var callbacks = this._events[eventName]; 
     for (var i = 0, l = callbacks.length; i < l; i++) { 
      callbacks[i].apply(null, args); 
     } 
    }, 
    test : function() { 
    this.raiseEvent('ON_TEST', [1,2,3]); // whatever args to pass to listeners 
    } 
}; 

Muhtemelen de dizide geri arama bulmak ve diziden çıkarın (muhtemelen ya, hiçbir geri arama verilirse bütün bir olay için tüm dinleyicileri kaldırmak) olurdu bir 'removeListener', eklemelidir.

+0

Bu, tüm bu yıllar sonra hala çok iyi bir çözüm sonra harika :) – luschn

+0

hızlı soru, iç addListener, neden tüm değişkenler? Fonksiyonu (eventName, geri arama) yapamazsınız {(this._events [eventName] = this._events [eventName] || []) push (geri arama); },? ya da sadece okunabilirlik sorusu mu? – WORMSS

+0

Okunabilirlik, neden, akıllılığı neden tercih eder? Ama aynı zamanda teknik olarak, bu dosyaya iki kez erişiyorsunuz. – InfinitiesLoop