В настоящее время я работаю над плагином с достаточно глубокой переменной настроек (3-4 уровня в некоторых местах). Следуя общепринятому шаблону jQuery Plugin, я реализовал простой способ для пользователей изменять настройки на лету, используя следующую запись:
$('#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;
}
Скажем по-другому: установив opt
после обхода, параметр, на который он фактически ссылается в переменной settings
, не изменяется после выполнения этого кода.
Прошу прощения за длинный вопрос, любая помощь приветствуется. Спасибо!
EDIT
В качестве второй попытки я могу сделать это, используя 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()
, потому что это может быть что угодно. Или дайте мне знать, если я параноик, и это вообще не должно вызывать проблем.