2015-02-13 2 views
6

मैं नोडजेएस में एक स्व-निष्पादन समारोह में एक कन्स्ट्रक्टर असाइन करने का प्रयास कर रहा हूं। मुझे पूरा यकीन है कि यह काम नहीं कर रहा है क्योंकि मेरा पैरामीटर मॉड्यूल.एक्सपोर्ट्स पर इशारा करते हुए एक चर है, लेकिन अगर मैं संभवतः स्वयं निष्पादन प्रारूप के करीब रहने के दौरान काम करने का कोई तरीका है तो मैं उत्सुक हूं।नोडजेएस - स्वयं निष्पादन समारोह में मॉड्यूल.एक्सपोर्ट्स के लिए कन्स्ट्रक्टर को कैसे असाइन करें?

यहाँ कैसे कोड बुलाया जा रहा है ...

var TemplateEngine = require('./templateEngine'); 
templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function" 

यहाँ कोड है कि ठीक काम करता है, इसका एक उदाहरण ...

var assert = require('assert'); 
var swig = require('swig'); 

// Constructor 
var TemplateEngine = function(args) { 
    assert.ok(args.engine, 'engine is required'); 
    var templateEngine = {}; 

    templateEngine.engine = args.engine; 

    templateEngine.Render = function(templateString, model) { 
     var result = swig.render(templateString, model); 
     return result; 
    }; 

    return templateEngine; 
}; 

module.exports = TemplateEngine; 

और यहाँ कोड शैली मैं था का एक उदाहरण है उपयोग करने के लिए, लेकिन जो "TypeError: ऑब्जेक्ट फ़ंक्शन नहीं है" त्रुटि उत्पन्न करता है क्योंकि मैं वास्तव में मॉड्यूल.एक्सपोर्ट्स को असाइन नहीं कर रहा हूं, केवल एक वेरिएबल जो कुछ भी इंगित कर रहा था उसकी प्रतिलिपि बनाई गई है।

(function(templateEngine) { 
    var assert = require('assert'); 
    var swig = require('swig'); 

    templateEngine = function(args) { 
     assert.ok(args.engine, 'engine is required'); 
     var templateEngine = {}; 

     templateEngine.engine = args.engine; 

     templateEngine.Render = function (templateString, model) { 
      var result = swig.render(templateString, model); 
      return result; 
     }; 

     return templateEngine; 
    }; 
})(module.exports); 

वहाँ मेरे लिए एक तरह से ऊपर स्वयं को क्रियान्वित करने के प्रारूप का उपयोग और मेरे मॉड्यूल निर्यात एक निर्माता के लिए है?

+0

module.exports करने की जरूरत है दूसरे कोड में असाइन किया जा सकता है, शायद मॉड्यूल.एक्सपोर्ट्स = नया टेम्पलेटइंजिन(); ? – dandavis

+1

आपके पास कई टेम्पलेट इंजन हैं ... – lujcon

+0

इस शैली की आवश्यकता नहीं है। आप इसे निजी चर छुपाने के लिए उपयोग कर सकते हैं ... लेकिन क्लाइंट साइड पर। नोडजेज़ में मॉड्यूल के साथ सबकुछ मॉड्यूल को सौंपा नहीं जाता है। निर्यात निजी है इसलिए यह पैटर्न बेकार है। – lujcon

उत्तर

8

अपने दूसरे उदाहरण में, आप बस templateEngine पैरामीटर को ओवरराइट कर रहे हैं, और इसका कोई प्रभाव नहीं होगा। अपने Iife में

पास module:

अपना पहला उदाहरण के रूप में एक ही परिणाम के लिए, बस

(function(module) { 

})(module); 

कि किसी प्रॉपर्टी को असाइन करें:

(function(module) { 
    var assert = require('assert'); 
    var swig = require('swig'); 

    module.exports = function (args) { 
     ... 
    }; 

})(module); 
+0

वाह। पता नहीं क्यों मैंने इसके बारे में सोचा नहीं। जब मैं घर आऊंगा, तो मैं कोशिश करूँगा, लेकिन मुझे लगता है कि यह बहुत अच्छा काम करेगा। –

+0

आपके उत्तर के लिए धन्यवाद! जब तक मैं जो कर रहा था उससे सीधे संबंध में नहीं था, यह वास्तव में मेरा समाधान बनाने में मददगार था! –

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