2012-08-23 13 views
5

मैं डेटा betweens दो स्क्रिप्ट्स को सही तरीके से कैसे संवाद करूं?स्क्रिप्ट के बीच संचार | तीन विधियां

इस विशेष मामले में मेरे पास एक स्क्रिप्ट में एक तत्व है, लेकिन मैं इसे किसी अन्य स्क्रिप्ट में जोड़ना चाहता हूं।

वैश्विक विंडो ऑब्जेक्ट का उपयोग करके-बीच में सबसे आसान तरीका यह है कि मैं इसे कर सकता हूं।

लेकिन ग्लोबल्स सर्वोत्तम अभ्यास नहीं हैं।

इस तत्व को दूसरी स्क्रिप्ट में पास करने का सही तरीका क्या है?

दोनों स्क्रिप्ट मॉड्यूल पैटर्न में encapsulated हैं।

स्क्रिप्ट 0 बनाएं तत्व प्वाइंट

var element = document.createElement("div"); 
element.innerHTML = response_text; 

स्क्रिप्ट 1 संलग्न तत्व प्वाइंट

Vi.sta = { 

    // implemented in the boot loader - shared global space - appended child already - you don't have to append until now. 
    // Static data has already been composed. 
    // Pull off window and append or best practice 

}; 

दोनों मॉड्यूल पैटर्न

(function(){ 
    // the code here 
})() 

उत्तर

4

सभी जेएस स्क्रिप्ट वैश्विक दायरे में चल रहे हैं। जब क्लाइंट को फ़ाइलें डाउनलोड की जाती हैं, तो उन्हें वैश्विक दायरे में पार्स किया जाता है।

// File_2.js 
var otherObj = { colour : myObj.colour }; 
जब तक

रूप File_1.js File_2.js

से पहले

आप तो भरी हुई है:

तो तुम

// File_1.js 
var myObj = { colour : "blue" }; 

मिल गया है, तो कुछ भी ऐसा करने से आप को रोकने है नामस्थान हैं, यानी: MYNAMESPACE = {}; और प्रत्येक फ़ाइल मॉड्यूल के माध्यम से आपके नामस्थान को विस्तारित करती है ("मॉड्यूल पैटर्न" के बजाय तत्काल-चालान कार्यों से इंटरफेस लौटने का जिक्र करते हुए), फिर मॉड्यूल के अस्तित्व की जांच करें।

यदि आप नामस्थान वाले ऐप के लिए मॉड्यूल लिख रहे हैं, और आपको एक मॉड्यूल से दूसरे मॉड्यूल में चरों तक पहुंच की आवश्यकता है, तो आपको इसके लिए interface प्रदान करना चाहिए।

आप SANDBOXING मॉड्यूल हैं, तो आप उन्हें प्रदान करने की आवश्यकता सब एक proxy एक service-locator या एक "registry", या विकसित एक messaging-system एक mediator-pattern के आधार पर करने के लिए इसी तरह की।

+0

जैसा कि मैंने बताया है कि दोनों स्क्रिप्ट मॉड्यूल पैटर्न में encapsulated हैं ... –

+0

@HiroProtagonist आपने *** *** *** पैटर्न पैटर्न का उल्लेख नहीं किया है। क्या आप 'खुलासा-मॉड्यूल' के बारे में बात कर रहे हैं, क्या आप 'नेमस्पेसिंग' के बारे में बात कर रहे हैं या आप 'सैंडबॉक्सिंग' के बारे में बात कर रहे हैं? क्योंकि सभी तीनों के कामकाज के बहुत अलग स्तर हैं। क्योंकि हमारे पास यह जानने का कोई तरीका नहीं है कि यह कौन सा है, हमारे पास यह जानने का कोई तरीका नहीं है कि कौन सा कामकाज सही है। – Norguard

+1

Google के लिए मेरे लिए बहुत अच्छे कुंजी शब्द - धन्यवाद, मैं इसे देख लूंगा। –

5
window.sharedSpace = {}; 
sharedSpace.sharedValue = 'foo bar'; 
में समाहित हैं

इस तरह से आप के बजाय केवल एक वैश्विक वस्तु है।

+0

मैं इसे लिखने की प्रक्रिया में था। मेरी घोषणा करने से पहले 'window.sharedSpace' के अस्तित्व की जांच करने के लिए मेरी एकमात्र सिफारिश होगी, केवल उस मौके पर जो पहले से मौजूद है। – jackwanders

+0

एक स्क्रिप्ट से लौटने और दूसरे में आयात करने के बारे में क्या ... क्या यह ग्लोबल्स से बचने के तरीके के रूप में बेहतर हो सकता है? –

+0

'रिटर्निंग' भाग जिसके बारे में आप बात करते हैं उसे वैश्विक 'फ़ंक्शन' की आवश्यकता होगी। जो पिछड़ा जा रहा है। –

1

आप मॉड्यूल में किसी फ़ंक्शन में तत्व क्यों नहीं पारित करते हैं?

var module1 = (function() { 
    return { 
     func1: function() { 
      // get your element 
      var someElement = ...; 

      // pass it to the other module 
      module2.func2(someElement); 
     } 
    }; 
})(); 

var module2 = (function() { 
    return { 
     func2: function (someElement) { 
      // do whatever you want with someElement 
     } 
    }; 
})(); 
+0

यहां तक ​​कि सरल, तत्व या ऑब्जेक्ट को निर्यात क्यों न करें, और उसके बाद इसे आयात करें मॉड्यूल पैटर्न की वैश्विक आयात सुविधा ... दोनों तरीकों से मुझे लगता है कि काम करेगा। –

+0

@HiroProtagonist मैं IIFE पर "वैश्विक आयात" – jbabey

+0

से परिचित नहीं हूं, बहुत आखिरी '()' यदि आप उनके पैरामीटर डालते हैं तो इसे 'वैश्विक आयात' कहा जाता है, यह केवल चर का उपयोग करने से एक अनुकूलन है वैश्विक दायरा, अब वे आयात किए जाते हैं और दायरे को देखो श्रृंखला कम हो जाती है। –

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