2012-04-21 15 views
66

मैंने docs पढ़ा है और source behind reactivity पर देखा है, लेकिन मुझे यह समझ में नहीं आता है।दृश्यों के पीछे उल्का की प्रतिक्रियाशीलता कैसे काम करती है?

क्या कोई यह बता सकता है कि यह दृश्यों के पीछे कैसे काम करता है, क्योंकि यह मुझे जादू की तरह दिखता है :)।

उत्तर

99

तो यह वास्तव में नहीं बल्कि सीधे आगे है, एक बुनियादी स्तर पर वहाँ कार्यों के 2 प्रकार शामिल हैं:

  1. कार्य है कि एक प्रतिक्रियाशील प्रसंग बना (प्रतिक्रियाशील समारोह)

  2. कार्य है कि एक प्रतिक्रियाशील अमान्य संदर्भ (फ़ंक्शन को अमान्य करना)

  3. कार्य जो दोनों कर सकते हैं। (मैं झूठ बोला था वहाँ 3 रहे हैं)

जब आप एक reactive function फोन यह एक context कि उल्का भंडार विश्व स्तर पर और जो reactive function सब्सक्राइब करने के लिए एक invalidation कॉलबैक पैदा करता है। फ़ंक्शन जिसे आप एक प्रतिक्रियाशील फ़ंक्शन, या उसके भीतर से चलने वाले किसी भी फ़ंक्शन पर पास करते हैं, invalidating function हो सकता है और वर्तमान context को पकड़ सकता है और इसे स्थानीय रूप से संग्रहीत कर सकता है। ये फ़ंक्शंस किसी भी समय, एक डीबी अपडेट या बस टाइमर कॉल की तरह, context को अमान्य कर सकते हैं। मूल reactive function तब उस घटना को प्राप्त करेगा और स्वयं का पुनर्मूल्यांकन करेगा।

यहाँ उल्का कार्यों का उपयोग कर कदम से एक कदम है (ध्यान दें कि Tracker.autorunDeps.autorun कहा जाता था):

Tracker.autorun(function(){ 
    alert("Hello " + Session.get("name")); 
}); 

Session.set("name", "Greg"); 
  1. ऑटोरन अपने पैरामीटर के रूप में एक समारोह लेता
  2. से पहले ऑटोरन इस समारोह चलता है, यह बनाता है context
  3. autorun context की अमान्यता घटना
  4. पर कॉलबैक संलग्न करता है यह कॉलबैक फिर से चलाएगा यह कार्य autorun
  5. पर पारित किया गया है, फिर फ़ंक्शन को पहली बार context में चलाया जाता है।
  6. उल्का भंडार वर्तमान में सक्रिय context
  7. समारोह के अंदर के रूप में विश्व स्तर पर इस context एक और समारोह है: है Session.get()
  8. Session.get() दोनों एक reactive function और एक invalidating function
  9. Session.get सेट इसे खुद context है और सहयोगियों यह कुंजी "नाम"
  10. Session.get वर्तमान संदर्भ (ऑटोरन के संदर्भ) को पुन: प्राप्त विश्व स्तर पर उल्का
  11. अमान्यकरण कॉलबैक से कि Session.get मैं करने के लिए पंजीकृत करता है के साथ आंतरिक टी के स्वयं के संदर्भ के लिए, बस को अमान्य कर देंगे यह संदर्भ संलग्न है (इस मामले में, ऑटोरन के संदर्भ)
  12. तो अब हम 2 संदर्भों, ऑटोरन और session.get के
  13. जब इन कार्यों लौटने के लिए, उल्का सक्रिय संदर्भ वैश्विक चर को साफ किया है

  14. सत्र।सेट context को अमान्य करने में सक्षम एक और फ़ंक्शन है।

  15. इस मामले में
  16. हम सत्र द्वारा बनाई गई सभी context रों कुंजी "नाम"
  17. उन contexts की
  18. सभी, जब अवैध उनके अमान्यकरण कॉलबैक चलाने के साथ जुड़े अमान्य कर रहे हैं।
  19. उन कॉलबैक सिर्फ अपने enclosing context रों (यह Session.get के डिजाइन है और नहीं क्या एक अमान्यकरण कॉलबैक करना चाहिए)
  20. उन enclosing contexts अब उनके अमान्यकरण कॉलबैक चलाने अमान्य हो जाएगा।
  21. ऑटोरन मामले में, वह कॉलबैक उस कार्य को चलाता है जिसे हम मूल रूप से ऑटोरन में पास करते हैं और फिर context को फिर से सेट करते हैं।

पूरे कार्यान्वयन वास्तव में नहीं बल्कि सीधे आगे और साथ ही है, तो आप इसे यहाँ देख सकते हैं:
https://github.com/meteor/meteor/blob/master/packages/tracker/tracker.js

और यह कैसे काम करता है का एक अच्छा उदाहरण यहां पाया जा सकता:
https://github.com/meteor/meteor/blob/master/packages/reactive-dict/reactive-dict.js

प्रतिक्रियाशील प्रोग्रामिंग वास्तव में उल्का या जेएस विशिष्टनहीं है आप इसके बारे में यहां पढ़ सकते हैं: http://en.wikipedia.org/wiki/Reactive_programming

+0

इस अच्छी व्याख्या के लिए अच्छा धन्यवाद –

+5

ग्रेट स्पष्टीकरण यह उल्का पृष्ठ में होना चाहिए। – alejandro

+1

यह वीडियो बहुत उपयोगी था http://www.eventedmind.com/posts/meteor-reactivity-with-contexts – jonperl

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