30

क्या कोई ईवेंट संचालित आर्किटेक्चर jQuery प्लगइन्स हैं?jQuery प्लगइन?

चरण 1: सदस्यता ली जा रही

alt text
ग्राहकों बीच में ईवेंट हैंडलर की सदस्यता, और घटना के नाम के रूप में एक कॉलबैक विधि में पारित, साथ ही वे के लिए ...

सुन रहे हैं

यानी दो हरे ग्राहक पी 0 कार्यक्रमों के लिए सुनेंगे। और नीला ग्राहक पी 1 घटनाओं के लिए सुन जाएगा।


चरण 2: p0 घटना इवेंट हैंडलर

alt text

  1. एक p0 घटना इवेंट हैंडलर
  2. ईवेंट हैंडलर को निकाल दिया जाता है के लिए एक और घटक द्वारा चलाई होने की सूचना यह है घटना के ग्राहक, में सब्सक्राइब किए गए कॉलबैक विधियों को कॉल करते हुए चरण 1: सदस्यता लें।

ध्यान दें कि नीले ग्राहक को अधिसूचित नहीं किया गया है क्योंकि यह पी 0 घटनाओं को नहीं सुन रहा था।


चरण 3: p1 घटना अब नीले इवेंट हैंडलर

alt text

करने के लिए एक घटक के सक्रिय होने पर p1 घटना है कि सिवाय

बस के रूप में पहले एक और घटक से निकाल दिया गया है ग्राहक को कॉलबैक के माध्यम से घटना प्राप्त होती है और अन्य दो हरे रंग के ग्राहकों को घटना नहीं मिलती है।

Images by leeand00, on Flickr

मैं एक खोजने के लिए नहीं कर पा रहे हैं, लेकिन मेरा अनुमान है कि वे सिर्फ यह जावास्क्रिप्ट/jQuery में कुछ और ही कहते हैं

इसके अलावा इस प्रतिरूप के लिए एक नाम है? क्योंकि यह सिर्फ एक मूल प्रकाशक/ग्राहक नहीं है, इसलिए मुझे कुछ और कहना होगा जिसे मैं सोचूंगा।

+0

कृपया अगर यह स्पष्ट नहीं है कि मैं क्या बात कर रहा हूँ मुझे पता है। – leeand00

उत्तर

48

आप शायद एक की जरूरत नहीं है ऐसा करने के लिए प्लगइन। सबसे पहले, डोम स्वयं पूरी तरह से घटना संचालित है। आप रूट नोड (एक तकनीक जो jQuery लाइव उपयोग करता है) पर सभी घटनाओं को सुनने के लिए ईवेंट प्रतिनिधिमंडल का उपयोग कर सकते हैं। कस्टम इवेंट्स को संभालने के लिए जो कि डोम से संबंधित नहीं हो सकता है, आप नौकरी करने के लिए एक सादे पुराने जावास्क्रिप्ट ऑब्जेक्ट का उपयोग कर सकते हैं। मैंने कोड के केवल एक पंक्ति के साथ MooTools में एक केंद्रीय इवेंट प्रेषक बनाने के बारे में blog post लिखा था।

var EventBus = new Class({Implements: Events}); 

यह भी jQuery में करना आसान है। एक नियमित जावास्क्रिप्ट ऑब्जेक्ट का उपयोग करें जो सभी घटनाओं के लिए केंद्रीय दलाल के रूप में कार्य करता है। कोई भी ग्राहक ऑब्जेक्ट इस ऑब्जेक्ट पर ईवेंट प्रकाशित और सब्सक्राइब कर सकता है। यह संबंधित question देखें।

var EventManager = { 
    subscribe: function(event, fn) { 
     $(this).bind(event, fn); 
    }, 
    unsubscribe: function(event, fn) { 
     $(this).unbind(event, fn); 
    }, 
    publish: function(event) { 
     $(this).trigger(event); 
    } 
}; 

// Your code can publish and subscribe to events as: 
EventManager.subscribe("tabClicked", function() { 
    // do something 
}); 

EventManager.publish("tabClicked"); 

EventManager.unsubscribe("tabClicked"); 

या यदि आप jQuery उजागर के बारे में परवाह नहीं है, तो बस एक खाली वस्तु का उपयोग करें और jQuery पर सीधे bind और trigger फोन वस्तु लपेटा।

var EventManager = {}; 

$(EventManager).bind("tabClicked", function() { 
    // do something 
}); 

$(EventManager).trigger("tabClicked"); 

$(EventManager).unbind("tabClicked"); 

रैपर अंतर्निहित jQuery पुस्तकालय को छिपाने के लिए तो आप बाद में कार्यान्वयन की जगह ले सकता है, अगर जरूरत हो तो बस देखते हैं।

यह मूलतः Publish/Subscribe या Observer pattern है, और कुछ अच्छे उदाहरण कोको के NSNotificationCenter वर्ग, EventBus पैटर्न GWT समुदाय में रे रयान द्वारा लोकप्रिय बनाया, और कई अन्य होगा।

+0

समाधान https://gist.github.com/786386 समान है, लेकिन टोकन के माध्यम से सदस्यता रद्द करने का समर्थन करता है। समाधान http://stackoverflow.com/a/2969692/873282 और भी उन्नत है और सदस्यता रद्द करने का समर्थन करता है (फ़ंक्शन के संदर्भ को पास करके) – koppor

+0

@ कोपर: आपका दूसरा लिंक * यह * उत्तर इंगित करता है। निश्चित रूप से आप कुछ और का जिक्र कर रहे थे? – Aaronaught

+0

मुझे याद नहीं है, मैं कौन सा यूआरएल संदर्भित करना चाहता था। शायद, मैं https://github.com/cujojs/msgs या https://github.com/sissbruecker/js-event-bus पर इंगित करना चाहता था? – koppor

2

उनमें से दो वास्तव में कर रहे हैं:

+0

अच्छा! धन्यवाद प्रमुख! मैं लंबे समय से जेएस में इस प्रकार की कार्यक्षमता की तलाश में हूं। – leeand00

+0

वास्तव में मुझे आश्चर्य हुआ कि JQuery के लिए प्लगइन्स की आवश्यकता है। आम तौर पर मैं प्रोटोटाइप का उपयोग करता हूं और वहां ऐसा करने का डिफ़ॉल्ट तरीका है। – vartec

+0

रुको शायद मैं जवाब के रूप में इसे स्वीकार करने में थोड़ा जल्दी था। मैंने उन्हें देखा, और उन पुस्तकालयों में से कोई भी केंद्रीय घटक नहीं है जिसके लिए घटनाएं निकाल दी जाती हैं और ग्राहकों को अधिसूचित किया जाता है। – leeand00

1

मैंने अपनी प्रकाशित/सदस्यता सेवाओं के लिए OpenAjax Hub का उपयोग किया है। यह एक jQuery प्लगइन नहीं है, लेकिन एक स्टैंडअलोन जावास्क्रिप्ट मॉड्यूल है। आप SourceForge से reference implementation डाउनलोड और उपयोग कर सकते हैं। मुझे पदानुक्रमित विषय नामकरण और वाइल्डकार्ड नोटेशन का उपयोग करके एकाधिक विषयों की सदस्यता लेने के लिए समर्थन पसंद है।

2

क्या यह एक लिग्थवेट संदेश पास फ्रेमवर्क के रूप में कार्य कर सकता है?

function MyConstructor() { 
    this.MessageQueues = {}; 

    this.PostMessage = function (Subject) { 
     var Queue = this.MessageQueues[Subject]; 
     if (Queue) return function() { 
             var i = Queue.length - 1; 
             do Queue[i](); 
             while (i--); 
            } 
     } 

    this.Listen = function (Subject, Listener) { 
     var Queue = this.MessageQueues[Subject] || []; 
     (this.MessageQueues[Subject] = Queue).push(Listener); 
    } 
} 

तो आप कर सकता है:

var myInstance = new MyConstructor(); 
myInstance.Listen("some message", callback()); 
myInstance.Listen("some other message", anotherCallback()); 
myInstance.Listen("some message", yesAnotherCallback()); 

और बाद में:

myInstance.PostMessage("some message"); 

कतारों

2

यह आसानी से एक डिस्पैचर के रूप में एक डमी jQuery नोड का उपयोग कर पूरा किया जा सकता प्रेषण होगा :

var someModule = (function ($) { 

    var dispatcher = $("<div>"); 

    function init() { 
     _doSomething(); 
    } 

    /** 
     @private 
    */ 
    function _doSomething() { 
     dispatcher.triggerHandler("SOME_CUSTOM_EVENT", [{someEventProperty: 1337}]); 
    } 

    return { 
     dispatcher: dispatcher, 
     init: init 
    } 

}(jQuery)); 



var someOtherModule = (function ($) { 

    function init() { 
     someModule.dispatcher.bind("SOME_CUSTOM_EVENT", _handleSomeEvent) 
    } 

    /** 
     @private 
    */ 
    function _handleSomeEvent (e, extra) { 
     console.log(extra.someEventProperty) //1337 
    } 

    return { 
     init: init 
    } 

}(jQuery)); 

$(function() { 
    someOtherModule.init(); 
    someModule.init(); 
}) 
+0

+1 मुझे डोम को बदलने के बिना ज्ञात डोम तकनीकों पर भरोसा करने का विचार पसंद है –

5

हालांकि नहीं एक jQuery प्लगइन, ट्विटर एक जावास्क्रिप्ट ढांचे जो आप घटक आधारित आर्किटेक्चर, जो घटनाओं के माध्यम से संवाद बनाने की अनुमति देता Flight बुलाया जारी किया।

उड़ान ट्विटर से एक हल्के, घटक आधारित जावास्क्रिप्ट रूपरेखा है। अन्य जावास्क्रिप्ट ढांचे के विपरीत जो एमवीसी पैटर्न के आसपास आधारित हैं, फ्लाइट मैप्स व्यवहार सीधे डोम नोड्स पर।

उड़ान अनुरोधों को रूट किया जाता है या जो templating पुस्तकालय आप उपयोग करना तय करने के लिए नास्तिक है। उड़ान चिंताओं को सख्त अलगाव लागू करती है। फ्लाइट में घटक एक दूसरे को सीधे संलग्न नहीं करते हैं।

वे घटनाओं के रूप में उनके कार्यों और उन घटकों उन घटनाओं की सदस्यता ली है उन पर आधारित कार्रवाइयां कर सकते हैं प्रसारण। उड़ान का उपयोग करने के लिए, आप एक एएमडी लोडर के साथ ES5-शिम और jQuery की आवश्यकता होगी।

Flight - A Lightweight, Component-Based JavaScript Framework From Twitter

2

एक हालिया विकास msgs.js "जावास्क्रिप्ट के लिए संदेश उन्मुख प्रोग्रामिंग। स्प्रिंग एकता से प्रेरित होकर" है।यह वेबसाकेट्स के माध्यम से संचार का भी समर्थन करता है।

msgs.js 'एंटरप्राइज़ इंटीग्रेशन पैटर्न' पुस्तक में परिभाषित शब्दावली और पैटर्न को जावास्क्रिप्ट को मैसेजिंग उन्मुख प्रोग्रामिंग को ब्राउजर और/या सर्वर साइड जावास्क्रिप्ट में विस्तारित करता है। मूल रूप से कमजोर युग्मित पृथक प्रणालियों को एकीकृत करने के लिए विकसित मैसेजिंग पैटर्न, एक ही अनुप्रयोग प्रक्रिया के भीतर बस ढीले युग्मित मॉड्यूल के साथ ही लागू होते हैं।

[...]

परीक्षण वातावरण:

  • Node.js (0.6, 0.8)
  • क्रोम (स्थिर)
  • फ़ायरफ़ॉक्स (स्थिर, ईएसआर, पहले में काम करना चाहिए संस्करण)
  • आईई (6-10)
  • सफारी (5, 6, आईओएस 4-6, पुराने संस्करणों में काम करना चाहिए)
  • ,210
  • ओपेरा (11, 12, पिछले संस्करणों में काम करना चाहिए)
संबंधित मुद्दे