2013-04-26 5 views
5

लोड मेरे ऐप में गतिशील भागों कि स्ट्रिंग है जो की तरह दिखता है के रूप में डेटाबेस से लोड किए गए हैं कर रहे हैं:RequireJS स्ट्रिंग

"define(['dependency1', 'dependency2'], function(){"+ 
" // function body" + 
"})" 

सिर्फ एक सरल requireJS मॉड्यूल है जो एक स्ट्रिंग के रूप,। मैं एसिंक आवश्यकता कॉल का उपयोग कर ऊपर लिपि को आलसी लोड करना चाहता हूं। इसलिए, मेरी मुख्य आवश्यकता जेएस स्क्रिप्ट इस तरह दिखती है:

require(["jquery"], function($){   
    $(document).ready(function(){ 
     // logic to load specific script from database 
     var scriptString = functionToLoadTheStringAbove(); 

     // ideally i would like to call it like this    
     require([scriptString], function(){ 
      // scriptString, dependency1, dependency2 are loaded 
     } 
    }); 
}); 

मैं उन स्ट्रिंग को जरूरी जेएस में कैसे लोड करूं? मुझे टेक्स्ट प्लगइन के बारे में पता है, लेकिन यह केवल फाइलों से लोड करने की अनुमति देता है। मैंने eval कोशिश की लेकिन यह निर्भरता को सही ढंग से हल नहीं करता है। मैं बस अपना समाधान यहाँ पोस्ट मामला किसी की जरूरत में

require(["jquery"], function($){   
    $(document).ready(function(){ 
     // logic to load specific script from database 
     var scriptString = functionToLoadTheStringAbove(); 

     var olddefine = define; // require js define 
     var runme; // capture function 
     define = function (args,func){ 
      runme = func; 
     } 
     eval(scriptString); 
     runme(); // run the function in current scope 
     define = olddefine; // restore requirejs function 

     // dependency1, dependency2 are loaded   
    }); 
}); 
+0

स्पष्ट करें। कृपया अपने प्रश्न का दोबारा जवाब दें। –

+0

ओह, क्या आप वाकई डेटाबेस में मूल्यांकन कोड संग्रहीत कर रहे हैं? –

+0

हां। मेरे मामले में यह ब्राउज़र एक्सटेंशन में था। इसलिए, फाइल सिस्टम में आरईएसटी एंडपॉइंट/डायनामिक कोड सहेजने का कोई विकल्प नहीं है। – bradnoriega

उत्तर

-1

आप ऐसा करने में सक्षम होना चाहिए।

तो मैं आवश्यकता जेएस मंच में पूछने और text! plugin और json! plugin के स्रोत की जांच करने के लिए समाप्त हो गया। RequJS में स्ट्रिंग से मॉड्यूल लोड करने का सबसे साफ तरीका स्ट्रिंग को लोड करने के लिए अपनी प्लगइन बनाकर है, और उसके बाद onLoad.fromText() का उपयोग करें जो 0 स्ट्रिंग eval आपकी स्ट्रिंग और सभी निर्भरताओं को हल करेगा। मेरी प्लगइन का

उदाहरण (यह db! प्लगइन कॉल):

require(["jquery", "db!myScript"], function($, myScript){   
    // jQuery, myScript and its dependencies are loaded from database 
}); 

नोट::

  1. कोई है

    define([], function(){ 
        var db = new Database(); // string is loaded from LocalStorage 
        return { 
         load: function(name, req, onLoad, reqConfig){ 
          db.get(name, function(err, scriptString){ 
           if (err) onLoad(err); 
           else onLoad.fromText(scriptString); 
          }); 
         } 
        } 
    }); 
    

    फिर आप की तरह प्लगइन का उपयोग कर सकते हैं eval के बिना स्ट्रिंग से require() तक रास्ता। यह onLoad.fromText() आंतरिक रूप से करता है। चूंकि eval बुरा है, आप केवल इसका उपयोग करना चाहिए यदि आप जानते हैं कि आप eval() पर क्या स्ट्रिंग जा रहे हैं। यदि आप ब्राउज़र एक्सटेंशन में इसका उपयोग कर रहे हैं, तो आप सीएसपी नीति को आराम करना चाहेंगे।

  2. अपने स्ट्रिंग मॉड्यूल का नाम देने के लिए, आप explicit naming syntax का उपयोग कर सकते हैं। इस तरह, आपके मॉड्यूल में हमेशा एक ही पूर्ण नाम होगा।
+2

यह काम नहीं करता है। चलने वाले रनमे() केवल निर्भरताओं को हल नहीं करते हैं + हम आवश्यकता के अनुसार प्रस्तावित दायरा/बंद खो देते हैं। – bradnoriega

0

थोड़ा और सीधे सवाल का जवाब करने के लिए, एक plugin इसलिए की तरह बनाने के लिए:

define("load-string",[], function(){ 
    var strings=[], 
     re_package_name = /^string_module_(\d+)$/; 
    return { 
     normalize: function(name, _){ 
      if(re_package_name.test(name)){ 
       return name 
      } 
      var nml = "string_module_" + (strings.push(name)-1); 
      return nml; 
     }, 
     load: function(name, _, onLoad, config){ 
      if(re_package_name.test(name)){ 
       onLoad.fromText(strings[name.match(re_package_name)[1]]); 
      }else{ 
       onLoad.error("Invalid package name: ",name); 
      } 
     } 
    } 
}); 

और इतने की तरह उपयोग: जबकि किसी भी सवाल पूछ

var world_module = "define([],function(){return 'world!'})"; 

require(["load-string!" + world_module], 
    function(x){ 
     console.log("Hello "+x); 
    }) 
संबंधित मुद्दे