2010-02-13 7 views
6

अरे ... मैं फ्लैश का उपयोग कर रहा हूं और मेरी कक्षाएं EventDispatcher क्लास का उपयोग करती हैं जो मुझे कक्षा की कस्टम घटनाओं को परिभाषित करने की अनुमति देती है। मैं जावास्क्रिप्ट में यह कैसे कर सकता हूं।जावास्क्रिप्ट प्रेषण

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

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

जावास्क्रिप्ट के साथ इस posible कैसे है:

मैं इस तरह कुछ करना चाहते हैं?

उत्तर

20

अपने आप को रोल करना होगा। यहाँ सिर्फ एक ही रास्ता है।

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 
    } 
}; 

आप शायद यह भी एक 'removeListener' है, जो सरणी में कॉलबैक खोजने के लिए और सरणी से हटाने (या शायद, अगर कोई कॉलबैक दिया एक पूरी घटना के लिए सभी श्रोताओं निकालने के लिए) करने के लिए होता जोड़ना चाहिए।

+0

यह बहुत अच्छा है, इन सभी वर्षों के बाद भी एक बहुत अच्छा समाधान :) – luschn

+0

त्वरित प्रश्न, addListener के अंदर, सभी चर क्यों? क्या आप 'फ़ंक्शन (ईवेंट नाम, कॉलबैक) नहीं कर सकते {{this._events [eventName] = this._events [eventName] || [])। पुश (कॉलबैक); }, '? या यह केवल पठनीयता का सवाल है? – WORMSS

+0

पठनीयता, निश्चित रूप से, चतुरता का पक्ष क्यों है? लेकिन तकनीकी रूप से, आप इसे दो बार एक्सेस कर रहे हैं। – InfinitiesLoop