2015-02-07 9 views
5

मेरी जेएस फाइलों में से एक में मैं एक और शामिल करता हूं। मैं शामिल मॉड्यूल में चर सेट कैसे कर सकता हूं?नोडजेएस मॉड्यूल में चर कैसे पास करें?

मैं कुछ इस तरह कर रही

var mymodule = require('mymodule.js'); 
mymodule.myvariable = 'test'; 

काम करेगा सोचा और फिर mymodule

this.myvariable === 'test'; 

लेकिन यह काम नहीं करता है, यह undefined है। मॉड्यूल में मूल्य पारित करने के लिए विभिन्न विकल्प क्या हैं? मैं केवल mymodule में कॉल किए गए प्रत्येक फ़ंक्शन के लिए पैरामीटर के रूप में चर जोड़ सकता हूं, लेकिन यह आदर्श नहीं है।

क्या ग्लोबल्स के बिना ऐसा करने का कोई तरीका है, ताकि मैं विभिन्न आवश्यक मॉड्यूल में स्वतंत्र रूप से चर सेट कर सकूं?

var mymodule1 = require('mymodule.js'); 
var mymodule2 = require('mymodule.js'); 
mymodule1.myvariable = 'test1'; 
mymodule2.myvariable = 'test2'; 
+0

उस क्रम के बारे में सोचें जिसमें यह हो रहा है, तो आपको पता चलेगा कि क्या हो रहा है। –

उत्तर

13

नोडजेएस require() हमेशा एक बार मॉड्यूल लोड करेगा ताकि आपको अपने मॉड्यूल में स्कोपिंग लागू करने की आवश्यकता होगी जहां मॉड्यूल के विभिन्न उदाहरण अपने आंतरिक राज्य के साथ मौजूद हो सकते हैं।

आप एक जे एस क्लास की तरह के रूप में अपने मॉड्यूल को लागू कर सकते हैं:

var MyModule = function(){}; 

MyModule.prototype.someFunction = function(params){ 
    this.someVar = params; 
} 

MyModule.prototype.anotherFunction = function(key, value){ 
    this[key] = value; 
} 

module.exports = MyModule; 
फिर अपने कोड में

;

var MyModule = require('MyModule'); 

someModule = new MyModule(); 

// treat someModule like an object with its getters/setters/functions 
+0

धन्यवाद, किसी ऑब्जेक्ट की तरह एक मॉड्यूल का इलाज करना वह अवधारणा था जिसे मैं याद कर रहा था। यहां अन्य 2 उत्तरों भी सहायक थे। – user779159

1

ठीक काम करना चाहिए। यहाँ एक काम कर उदाहरण है:

index.js

var module = require('./module.js'); 
module.myvar = 'Hello world'; 
module.test(); 

module.js

module.exports = { 
    test: function() { 
     console.log('var is', this.myvar); 
    } 
}; 

ध्यान रखें कि यदि आप एक बंद में this का उपयोग करें कि गुंजाइश अब किसी भी मॉड्यूल नहीं है अपने आप। तो यह आपकी समस्या हो सकती है।

क्या आप मुझे मॉड्यूल कोड का हिस्सा दिखा सकते हैं जहां आप इसका उपयोग करते हैं?

7

आप क्या कर रहे थे के साथ समस्या यह आप आयात करने के बाद चर सेट है कि है, लेकिन जब मॉड्यूल आयात किया गया था this.myvariable === 'test'; बुलाया जा रहा था, पहले अपने चर सेट किया गया था।

आप अपना मॉड्यूल एक फ़ंक्शन निर्यात कर सकते हैं और फिर जब आप आयात करते हैं तो फ़ंक्शन को कॉल करें, एक तर्क के रूप में अपना चर पारित करें।

module.exports = function(myVar) { 
    var myModule = { 
    // has access to myVar 
    ... 
    }; 

    return myModule; 
}; 

जब आप आयात,

var myModule = require('myModule')(myVar); 

आप इस विधि का उपयोग करते हैं, ध्यान रखें कि आप अपने मॉड्यूल का एक अलग उदाहरण भी आप आयात करते हैं, जो नहीं हो सकता है कि आप क्या चाहते हैं में रहते हैं।

यदि आप मॉड्यूल के बाहर से मॉड्यूल के मान सेट करना चाहते हैं, तो एक अच्छा विकल्प यह है कि आपका मॉड्यूल एक ऑब्जेक्ट को एक सेटर विधि के साथ निर्यात करे, और ऑब्जेक्ट की संपत्ति के रूप में चर के मान को सेट करने के लिए इसका उपयोग करें । इससे यह स्पष्ट हो जाता है कि आप यह मान सेटटेबल होना चाहते हैं, जबकि myModule.myVar = केवल बाद में भ्रम के लिए सेट कर सकते हैं।

module.exports = { 
    myVar: null, 

    setMyVar: function(myVar) { 
    this.myVar = myVar; 
    }, 

    ... 

}; 

इस मामले में आप मॉडल के उसी उदाहरण को एक्सेस कर रहे हैं जहां भी आप इसे आयात करते हैं।

टिप्पणी करने के लिए

जवाब में

संपादित पहला विकल्प में आपको कहां पर एक अलग उदाहरण प्रत्येक समय मिलता है, मैं कैसे कई कार्यों कि प्रत्येक शेयर एक ही myVar निर्यात कर सकते हैं? यदि वह मॉड्यूल 5 कार्यों को निर्यात करता है जिन्हें प्रत्येक को मेरी वीर की आवश्यकता होती है, तो क्या मैं इसे प्रत्येक स्थान पर में पास करने के बजाय आयात समय की तरह एक स्थान पर सेट कर सकता हूं?

नहीं

पूरी तरह से यकीन है कि अगर मैं समझता हूँ कि तुम क्या वर्णन कर रहे हैं, लेकिन आप कुछ इस तरह कर सकता है:

module.exports = function(myVar) { 
    var modules = {}; 
    modules.someModule = {...}; 
    modules.anotherModule = {...}; 
    ... 

    return modules; 
}; 

इन उप-मॉड्यूल से प्रत्येक एक ही myVar के लिए उपयोग किया जाएगा। तो आप ऊपर के रूप में आयात करेंगे और परिणाम एक ऑब्जेक्ट होगा जिसमें आपके प्रत्येक पांच मॉड्यूल गुणों के रूप में होंगे। मैं यह नहीं कह सकता कि यह एक अच्छा विचार है, यह बहुत मजबूत हो रहा है, लेकिन शायद यह आपकी स्थिति के लिए समझ में आता है।

+0

पहले विकल्प में आप दिखाते हैं कि आपको हर बार एक अलग उदाहरण कहां मिलता है, मैं कई कार्यों को कैसे निर्यात कर सकता हूं जो प्रत्येक एक ही 'myVar' साझा करते हैं? यदि वह मॉड्यूल 5 कार्यों को निर्यात करता है जिन्हें 'myVar' की आवश्यकता होती है, तो क्या मैं इसे प्रत्येक कार्य में पास करने के बजाय आयात समय पर एक स्थान पर सेट कर सकता हूं? – user779159

+1

संपादित उत्तर देखें। –

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