2013-04-12 8 views
6

मैं सी # के लिए जावास्क्रिप्ट में घटनाओं अनुकरण करना चाहते हैं की तरह: क्या मैं करना चाहता हूँ कुछ इस तरह है:अनुकरण सी # जावास्क्रिप्ट में घटनाओं

चलो कहते हैं कि मैं निम्नलिखित कोड डालें:

function addToInvocationList(method, listener) { 
     *Some code to add listener to the invocation list of method* 
} 

function MyClass() { 
} 

MyClass.prototype.Event = function() {} 

var my_class_obj = new MyClass(); 

function subscriberFunction1() {} 
function subscriberFunction2() {} 
function subscriberFunction3() {} 

addToInvocationList(my_class_obj.Event, subscriberFunction1); 
addToInvocationList(my_class_obj.Event, subscriberFunction2); 
addToInvocationList(my_class_obj.Event, subscriberFunction3); 

my_class_obj.Event(); 

जो मैं चाहता ऐसा करने के लिए जब मैं my_class_obj.Event कहता हूं, सभी सब्स्क्राइब किए गए कार्यों को बुलाया जाता है।

क्या यह जावास्क्रिप्ट में पूरी तरह से हासिल किया जा सकता है या मुझे डोम घटनाओं के माध्यम से अपना रास्ता खोजने की ज़रूरत है?

उत्तर

4

कैसे एक अलग घटना वर्ग लिखने के बारे में: संदर्भ लिंक: http://alexatnet.com/articles/model-view-controller-mvc-javascript

function Event(sender) { 
    this._sender = sender; 
    this._listeners = []; 
} 

Event.prototype = { 
    attach: function (listener) { 
     this._listeners.push(listener); 
    }, 
    notify: function (args) { 
     for (var i = 0; i < this._listeners.length; i++) { 
      this._listeners[i](this._sender, args); 
     } 
    } 
}; 

और अपने मेरी कक्षा। उदाहरण के लिए:

function MyClass(name) { 
    var self = this; 
    self.Name = name; 
    self.nameChanged = new Event(this); 

    self.setName = function (newName){ 
     self.Name = newName; 
     self.nameChanged.notify(newName); 
    } 
} 

घटना उदाहरण कोड के लिए सदस्यता लें:

var my_class_obj = new MyClass("Test"); 
my_class_obj.nameChanged.attach(function (sender,args){ 

}); 
my_class_obj.setName("newName"); 

आप अधिक ईवेंट हैंडलर्स संलग्न कर सकते हैं और इन सभी ईवेंट हैंडलर्स कहा जाता हो जाएगा। और आप जितनी चाहें उतनी घटनाएं भी जोड़ सकते हैं: उदाहरण के लिए पता बदलें घटना। यह दृष्टिकोण सी # घटना (प्रेषक और तर्क) को भी अनुकरण करता है

+1

बिल्कुल वही है जो मैंने पाया, धन्यवाद आदमी! यह बहुत अच्छा काम करता है! तथापि। मैं कचरा संग्रह के बारे में सोच रहा हूं, अगर एक हैंडलर को हटाना चाहता था, तो मैं यह कैसे सुनिश्चित कर सकता हूं कि यह कचरा इकट्ठा किया गया है, क्या अज्ञात तरीके कचरा इकट्ठा किया गया है जैसे ही उनका संदर्भ हटा दिया गया है ?? – hiddenUser

+1

अच्छी तरह से, इस मामले में अज्ञात विधियों और घोषित विधियों के बीच कोई अंतर नहीं होना चाहिए। हम आमतौर पर jQuery में अज्ञात विधियों का उपयोग करते हैं: $ (दस्तावेज़) .ready (function() {}); –

0

आप अपना स्वयं का पर्यवेक्षक (प्रकाशक-ग्राहक) जीओएफ पढ़ सकते हैं। या, यदि jQuery का उपयोग कर रहे हैं, तो कस्टम इवेंट (http://api.jquery.com/trigger/) आपकी मदद कर सकता है।

संबंधित मुद्दे