मैं वर्तमान में एक सेटिंग चर के साथ एक प्लगइन काम कर रहा हूं जो काफी गहरा है (कुछ स्थानों में 3-4 स्तर)। आम तौर पर स्वीकार jQuery प्लगइन पैटर्न के बाद मैं उड़ निम्नलिखित अंकन का उपयोग पर सेटिंग्स को संशोधित करने के उपयोगकर्ताओं के लिए एक आसान तरीका लागू किया है:jQuery प्लगइन - दीप विकल्प संशोधन
$('#element').plugin('option', 'option_name', 'new_value');
यहाँ कोड है कि मैं क्या अब विकल्प विधि के लिए उपयोग कर रहा हूँ के समान है।
option: function (option, value) {
if (typeof (option) === 'string') {
if (value === undefined) return settings[option];
if(typeof(value) === 'object')
$.extend(true, settings[option], value);
else
settings[option] = value;
}
return this;
}
अब विचार करें मैं बहुत की तरह एक सेटिंग चर है:
var settings = {
opt: false,
another: {
deep: true
}
};
मैं मैं निम्नलिखित संकेतन का उपयोग करने के लिए है deep
सेटिंग में बदलाव करना चाहते हैं:
$('#element').plugin('option', 'another', { deep: false });
हालांकि, चूंकि अभ्यास में मेरी सेटिंग्स 3-4 स्तरों की गहरी हो सकती है, मुझे लगता है कि निम्नलिखित नोटेशन अधिक उपयोगी होगा:
$('#element').plugin('option', 'another.deep', false);
हालांकि मुझे यकीन नहीं है कि यह कितना व्यवहार्य है, न ही इसे करने के बारे में कैसे जाना है। पहले प्रयास के रूप में मैंने प्रश्न में विकल्प को "ट्रैवर्स" करने का प्रयास किया और इसे सेट किया, लेकिन यदि मैंने अपना ट्रैवर्सिंग वैरिएबल सेट किया है तो यह मूल सेटिंग वैरिएबल में संदर्भों को सेट नहीं करता है।
option: function (option, value) {
if (typeof (option) === 'string') {
if (value === undefined) return settings[option];
var levels = option.split('.'),
opt = settings[levels[0]];
for(var i = 1; i < levels.length; ++i)
opt = opt[levels[i]];
if(typeof(value) === 'object')
$.extend(true, opt, value);
else
opt = value;
}
return this;
}
एक और तरीका है कि कहने के लिए: traversing के बाद opt
की स्थापना करके, यह स्थापित करने के लिए वास्तव में में settings
चर अपरिवर्तित है इस कोड को चलाता है के बाद से है।
मैं लंबे प्रश्न के लिए क्षमा चाहता हूं, किसी भी मदद की सराहना की जाती है। धन्यवाद!
संपादित
मैं यह कर सकता एक दूसरा प्रयास का उपयोग कर के रूप में eval()
तो जैसे:
option: function (option, value) {
if (typeof (option) === 'string') {
var levels = option.split('.'),
last = levels[levels.length - 1];
levels.length -= 1;
if (value === undefined) return eval('settings.' + levels.join('.'))[last];
if(typeof(value) === 'object')
$.extend(true, eval('settings.' + levels.join('.'))[last], value);
else
eval('settings.' + levels.join('.'))[last] = value;
}
return this;
}
लेकिन मैं वास्तव में अगर कोई मुझे के लिए एक रास्ता दिखा सकते हैं देखना चाहेंगे eval का उपयोग नहीं करें। चूंकि यह एक उपयोगकर्ता इनपुट स्ट्रिंग है, इसलिए मैं eval()
नहीं चलाऊंगा क्योंकि यह कुछ भी हो सकता है। या मुझे बताएं कि क्या मैं पागल हो रहा हूं, और इससे कोई समस्या नहीं होनी चाहिए।
शानदार, संदर्भों पर भ्रम इस मुद्दे को ढंक रहा था। मेरे लिए वह सही करने के लिए धन्यवाद; मेरे पास आपके उत्तर के लिए धन्यवाद एक कार्य विधि है। – Chad