2012-10-30 10 views
5

मैंने देखा है कि कुछ टीमों के लिए जो मैं काम कर रहा हूं उनमें से कुछ विरासत स्क्रिप्ट्स अब मेरी टीम डोजो 1.8 में अपग्रेड करने के बाद काम नहीं कर रही थीं। विशेष रूप से, उनके द्वारा बनाए गए वैश्विक चर को और नहीं बनाया जा रहा था।दोजो 1.8 - वैश्विक चर बनाने में

मैंने चारों ओर खोद दिया और पाया कि डोजो 1.8 टीम वैश्विक चर के प्रति बहुत अधिक विरोध कर रही है। तो वास्तव में विरोध किया,, वे इसे उपयोगकर्ता उनके के अंत में निम्नलिखित कोड का उपयोग कर एक आवश्यक लिपि में एक वैश्विक चर बनाने के लिए के लिए शारीरिक रूप से असंभव बना कि आवश्यकता होती है:

req.eval = 
     function(text, hint){ 
      return eval_(text + "\r\n////@ sourceURL=" + hint); 
     }; 
var eval_ = new Function('return eval(arguments[0]);'); 

कि अद्भुत और सभी, लेकिन पुराने है जिस कोड के साथ मैं काम कर रहा हूं उसे बदला नहीं जा सकता है, इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि इसके आसपास कैसे जाना है और इसके बजाय स्थानीय संदर्भ में eval निष्पादित करें।

सौभाग्य से, dojo.eval अभी भी दोजो के पुराने संस्करणों से है, और यह वही है जो मैं चाहता हूं। तो मुझे बस req.eval तक पहुंच प्राप्त करने की आवश्यकता है और कुछ मामलों में return dojo.eval(...) या यहां तक ​​कि केवल eval(...) करने के लिए फ़ंक्शन को बदलने की आवश्यकता है।

समस्या यह है कि, मैं यह समझने में सक्षम नहीं हूं कि req तक पहुंच कैसे प्राप्त करें। यहां क्या होता है:

मैं अपनी HTML फ़ाइल के शीर्ष पर स्क्रिप्ट टैग में dojo.js शामिल करता हूं। यह अपनी स्क्रिप्ट फ़ाइल में लोड होता है।

dojo.require मेरी अपनी फाइलों से सुलभ है। यह स्क्रिप्ट फ़ाइल में define साथ परिभाषित किया है:

'dojo/_base/loader':function(){ 
define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) { 

मुझे लगता है कि अगर जरूरी है या नहीं यकीन नहीं है। वैसे भी, dojo.require के दायरे के अंदर, मैं injectModule नामक कुछ देख सकता हूं, जबकि मेरी अपनी फ़ाइल में मैं नहीं कर सकता। injectModule एक स्थानीय चर है इसलिए आप इसे this के साथ नहीं देख सकते हैं।

req.getText(url, legacyMode!=sync, xhrCallback);

जो req.eval को जाता है: यह है, अर्थात

(function(){ ... injectModule = function(){} ... })(); 
injectModule समारोह अंदर

फ़ाइल के शुरू में एक गुमनाम समारोह में परिभाषित किया गया है, वहाँ निम्न पंक्ति है। तो injectModulereq देख सकते हैं।

मुझे यकीन नहीं है कि क्या करना है। मेरी घृणास्पद जावास्क्रिप्ट चालों में से कोई भी मुझे स्कॉप्स के इस ग्रिडॉक पर नेविगेट करने में मदद नहीं करता है। एक अच्छी शुरुआत यह पता लगाना होगा कि injectModule मेरी बाहरी स्क्रिप्ट फ़ाइल से dojo.require पर कॉल कैसे करें। मैं इसे 'बाइंड' के साथ करने में सक्षम नहीं था, हालांकि, क्योंकि यह एक अज्ञात फ़ंक्शन में परिभाषित स्थानीय चर है। क्या यह भी संभव होगा?

फ़ाइल 1:

<script src="dojo.js"></script> 
dojo.require(File 3); 
console.log(globalVar); 

फ़ाइल 2:

(function(){req.eval = unhelpful function})(); 
define(["require"], function(module){ 
    dojo.require = function(x){req.eval(x)} 
}); 

फ़ाइल 3:

globalVar = ...; 

मैं

चीजों को थोड़ा आसान बनाने के लिए, यहाँ एक सारांश है फ़ाइलों 1 और 3 संशोधित कर सकते हैं, लेकिन फ़ाइल 3 वाईआई हमेशा एक वैश्विक चर की आवश्यकता होगी। मैं फ़ाइल 2 को संशोधित नहीं कर सकता। लक्ष्य बेहतर काम करने के लिए फ़ाइल 2 में req.eval को बदलना है।

वैश्विक चर पहले की घोषणा से काम नहीं करता क्योंकि गुंजाइश परिवर्तन फ़ाइल 3 का मतलब अभी भी नहीं यह देखने के लिए सक्षम हो जाएगा।

परावर्तन और स्ट्रिंग प्रतिस्थापन काम नहीं करता क्योंकि गुंजाइश गलत है और जे एस सर्वर साइड पर न्यूनतम किया गया है।

फ़ाइल 1 से विधियों को ओवरराइट करना काम नहीं करता है क्योंकि मैं दायरे से नहीं देख सकता।

जावास्क्रिप्ट bind समारोह का उपयोग करते हुए और साथ ही निरर्थक हो गया है।

+0

आप फ़ाइल 3 में करने की कोशिश की 'window.globalVar = 42' है? – James

+0

मैंने नहीं किया और वह काम किया, धन्यवाद। मैं वास्तव में समझ नहीं पा रहा हूं कि कैसे 'n = 5' और' window.n = 5' अलग हो रहा है। –

उत्तर

2

ग्लोबल स्कोप को वैश्विक window ऑब्जेक्ट के माध्यम से एक्सेस किया जा सकता है, इसलिए window.foo = 'bar' वैश्विक चर foo बनाने जैसा ही है। इसके बारे में अधिक जानकारी यहां: https://stackoverflow.com/a/4862268/168382

+1

यह काम किया, हालांकि मुझे अभी भी यकीन नहीं है कि क्यों। मैंने सोचा था कि 'n = 5' और' window.n = 5' ने वही किया था, लेकिन मुझे लगता है कि ऐसा करने का दोजो तरीका उन्हें अलग-अलग चीजें करता है, जहां दूसरा अभी भी काम करता है। –

+0

दोजो के अपने 'वैश्विक' उपनाम के बारे में अन्य उत्तर अधिक सही लगता है क्योंकि यह Node.js जैसे संदर्भों में काम करेगा; यहां दस्तावेज़: http://dojotoolkit.org/reference-guide/1.8/dojo/_base/kernel.html#dojo-base- कर्नेल-global – slikts

3

इसके लिए, डोजो ने dojo.global बनाया है। यह window पर इंगित करेगा जिसमें डोजो लोड किया गया है (फ़्रेम किए गए लेआउट के लिए अच्छा)।

तो इसलिए की तरह अपने वैश्विक चर घोषित:

require([ "dojo/_base/kernel", ... ] , function(kernel) { 
    kernel.global.globalVariable = 1; 
    console.log('set') 
}) 

dojo.addOnLoad(function() {console.log('get', globalVariable);}); 
+2

दोजो में 1.8 'वैश्विक' अब 'डोजो/_बेस/कर्नेल' में है, तो यह 'dojo.global' के बजाय' kernel.global' है – slikts

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