2012-10-26 15 views
6

मैं जावास्क्रिप्ट प्रकटीकरण मॉड्यूल पैटर्न का बहुत उपयोग कर रहा हूं और मुझे सार्वजनिक इंटरफ़ेस और आंतरिक के बीच स्पष्ट पृथक्करण पसंद है। हालांकि मैं एक ऐसी स्थिति में चल रहा हूं जो मुझे आश्चर्यचकित करता है कि मेरा समग्र उपयोग पैटर्न सही है, या यदि मुझे पैटर्न के कुछ प्रकार का उपयोग करना चाहिए।जावास्क्रिप्ट मॉड्यूल पैटर्न का खुलासा - फ़ंक्शन के बाद प्रारंभिक चर का खुलासा

समस्या जब कुछ एक मॉड्यूल का init समारोह में पारित कर दिया है और यह भी सार्वजनिक रूप से उजागर करने की आवश्यकता है आंतरिक उपयोग के लिए निजी तौर पर संग्रहित, या तो एक नॉकआउट बाध्यकारी अभिव्यक्ति या कुछ अन्य मॉड्यूल में है। मॉड्यूल का रिटर्न स्टेटमेंट तुरंत निष्पादित होता है और कुछ समय बाद इनिट फ़ंक्शन को कॉल किया जाता है, आमतौर पर कुछ गतिशील पैरामीटर जैसे कि अजाक्स यूआरएल या कच्चे JSON को रेजर व्यू में स्क्रिप्ट ब्लॉक में प्रस्तुत किया जाता है। चूंकि मॉड्यूल का रिटर्न स्टेटमेंट केवल संदर्भ के बजाय निजी चर की प्रतिलिपि देता है, मेरी सेटिंग कि init फ़ंक्शन में निजी चर जो पहले से ही वापस कर चुका है उसे बदल नहीं सकता है।

var productsModule = function() { 

var urls; 

var init = function(ajaxUrls) { 
    urls = ajaxUrls; 
}; 

return { 
    init: init, 
    urls: urls, 
    getUrls: function() { return urls; } 
}; 

}(); 

var customersModule = function() { 

var doSomethingWithProductsModule = function() { 
    alert(productsModule.urls); // undefined 
    alert(productsModule.getUrls()); // object 
} ;  

return { 
    doSomethingWithProductsModule: doSomethingWithProductsModule 
}; 

}(); 

var urls = { 
getProduct: '/Product/' 
}; 

productsModule.init(urls); 

customersModule.doSomethingWithProductsModule(); 

मेरे वैकल्पिक हल सिर्फ इस तरह के "यूआरएल" एक समारोह के रूप में वस्तुओं लपेट और फिर productsModule.getUrls द्वारा पहुंचने की है()। हालांकि यह बहुत गन्दा हो जाता है, विशेष रूप से यदि चर एक नॉकआउट अवलोकन योग्य है जो स्वयं ही एक कार्य है, और इसलिए इसका मूल्यांकन करने के लिए मुझे उत्पादों को मॉड्यूल.getMyObservable()() जैसे डबल ब्रैकेट का उपयोग करने की आवश्यकता है।

क्या किसी ऐसे चीज का उपयोग करके अद्यतित आंतरिक मूल्यों को प्राप्त करने का कोई अच्छा तरीका है जो कम से कम प्रकट मॉड्यूल पैटर्न का अनुमान लगाता है?

उत्तर

2

हालांकि मैं अपनी वस्तुओं के सभी संभव स्तरों के माध्यम से पुनरावृत्ति के लिए उन है कि जैसे विलय करने के लिए होने के विचार की तरह पूरी तरह से नहीं करते हैं, एल योबो का जवाब मुझे मॉड्यूल फ़ंक्शन के परिणाम बनाने के बारे में सोच मिला है अपने आप में एक स्थानीय चर जिसका गुण मैं अद्यतन कर सकता था।

var productsModule = function() { 

var urls; 

var init = function(ajaxUrls) { 
urls = ajaxUrls; 
result.urls = urls; 
}; 

var result = { 
init: init, 
urls: urls 
}; 

return result; 

}(); 


// Before init 
alert(productsModule.urls); // undefined 

var urls = { 
getProduct: '/Product/' 
}; 

productsModule.init(urls); 

alert(productsModule.urls.getProduct); // /Product/ 
+0

यदि आप केवल साधारण वस्तुओं में गुजरने जा रहे हैं, तो विलय करने के लिए ओवरहेड न्यूनतम है, लेकिन यह बेहतर प्रतीत होता है। –

+0

मेरे अपने उत्तर को स्वीकार करने के लिए मेरे बारे में गाल, लेकिन मुझे सही दिशा में इंगित करने के लिए धन्यवाद। –

+0

@ टॉमहॉल: अपना जवाब स्वीकार करना ठीक है। एक जवाब में एक प्रश्न लिखना नहीं है। –

2

मूल प्रकार मूल्य से पारित होते हैं जबकि ऑब्जेक्ट संदर्भ द्वारा पारित होते हैं; आप इसका फायदा उठा सकते हैं ताकि productsModule में urls ओवरराइट करने के बजाय आप इसे अपडेट कर सकें। इस तरह प्रारंभिक मॉड्यूल आमंत्रण में वापस संदर्भ दिया गया है। मैंने अपना कोड अपडेट करने के लिए अपना कोड अपडेट किया है।

var productsModule = function() { 

var urls = {}; 

var init = function(ajaxUrls) { 
    // Merge properties into the original object instead; more robust approach 
    // may be needed 
    for (name in ajaxUrls) { 
     if (ajaxUrls.hasOwnProperty(name)) { 
      urls[name] = ajaxUrls[name]; 
     } 
    } 
}; 

return { 
    init: init, 
    urls: urls, 
    getUrls: function() { return urls; } 
}; 

}(); 

var customersModule = function() { 

var doSomethingWithProductsModule = function() { 
    alert(productsModule.urls); // undefined 
    alert(productsModule.getUrls()); // object 
} ; 

return { 
    doSomethingWithProductsModule: doSomethingWithProductsModule 
}; 

}(); 

var urls = { 
    getProduct: '/Product/' 
}; 

productsModule.init(urls); 

customersModule.doSomethingWithProductsModule(); 
+0

* ऑब्जेक्ट संदर्भ द्वारा पारित किए जाते हैं *, क्या यह कहना बेहतर होगा * सभी मूल्य से पारित होते हैं, लेकिन किसी ऑब्जेक्ट का मान संदर्भ * है? – alex

+0

ओह, अब आप मेरा सिर चोट पहुंचा रहे हैं;) मुझे यकीन नहीं है कि यह वास्तव में कुछ अलग कह रहा है। –

+0

यदि यह एक संदर्भ था, तो क्या आप उम्मीद करेंगे कि यह [sfiddle] (http://jsfiddle.net/KdgRP/) आउटपुट को "मान नहीं" '? मैं 100% निश्चित नहीं हूं, लेकिन मुझे यकीन है कि कोई व्यक्ति पॉप-इन करेगा और एक निश्चित उत्तर देगा। – alex

1

आप यूआरएल को एक अवलोकन योग्य संपत्ति क्यों नहीं बनाते? मेरे उदाहरण में

देखो:

http://jsfiddle.net/Razaz/zkXYC/1/

var productsModule = function() { 

    var urls=ko.observable(); 

    var init = function(ajaxUrls) { 
     urls(ajaxUrls); 
    }; 

    return { 
     init: init, 
     urls: urls, 
     getUrls: function() { return urls(); } 
    }; 

}(); 

var customersModule = function() { 

    var doSomethingWithProductsModule = function() { 
     alert(productsModule.urls()); // undefined 
     alert(productsModule.getUrls()); // object 
    };  

    return { 
     doSomethingWithProductsModule: doSomethingWithProductsModule 
    }; 

}(); 

var urls = { 
    getProduct: '/Product/' 
}; 

productsModule.init(urls); 

customersModule.doSomethingWithProductsModule();​ 

नमस्ते।

+0

एक नॉकआउट.जेएस दुनिया में जो शायद कुछ गुणों के लिए एक उचित विकल्प है, हालांकि यह आरएमपी के अजीब प्रवाह के आसपास अनावश्यक ओवरहेड (सब्सक्रिप्शन) और ब्रैकेट की तरह लगता है। अक्सर मेरा मॉड्यूल एक भारी शीर्ष-स्तरीय दृश्य मॉडल का पर्दाफाश करेगा जो मैं स्वयं को देखने योग्य नहीं दिखाना चाहता, केवल इसकी गुणधर्म और उसके बच्चे के दृश्य मॉडल के। लेकिन फिर भी अच्छी सोच। –

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