#javascript #selector
#javascript #селектор
Вопрос:
Справочная информация: У меня есть функция, которую я вызываю следующим образом:
hide_modules('string1','string2');
Функция выглядит примерно так:
function hide_modules(param1,param2) {
MM.getModules()
.withClass(param1)
.exceptWithClass(param2)
.enumerate(function(module) {
module.hide(
// some other code
);
});
}
Большую часть времени я вызываю функцию со значениями, как показано выше.
Иногда я не хочу, чтобы ‘string1’ имел значение, и я бы хотел, чтобы моя функция не использовала этот первый селектор, эффективно вот так:
MM.getModules()
// .withClass(param1)
.exceptWithClass(param2)
.enumerate(function(module) {
module.hide(
// some other code
);
});
Я пытался просто вызвать его с пустой строкой, 0, false как param1, но выбор класса конечного результата — это не то, что я хочу.
Иногда я также вызываю это с пустым параметром param2 и не хочу, чтобы также использовался связанный с param2 селектор.
Итак, вопрос в следующем: без написания большого оператора if-then-else, есть ли какой-нибудь необычный способ, которым я могу сделать эти селекторы нефункциональными (эквивалент закомментирования, как указано выше), когда значения param1 и / или param2 не указаны?
Вспомогательный код, который вызывает моя функция, предоставлен для меня в сторонней библиотеке, которую я не могу изменить. Я включаю некоторые из соответствующих частей здесь, поскольку это может помочь с ответом:
var withClass = function (className) {
return modulesByClass(className, true);
};
var modulesByClass = function (className, include) {
var searchClasses = className;
if (typeof className === "string") {
searchClasses = className.split(" ");
}
var newModules = modules.filter(function (module) {
var classes = module.data.classes.toLowerCase().split(" ");
for (var c in searchClasses) {
var searchClass = searchClasses[c];
if (classes.indexOf(searchClass.toLowerCase()) !== -1) {
return include;
}
}
return !include;
});
Ответ №1:
Поскольку js не поддерживает перегрузку функций, единственный способ — проверить ваши параметры внутри вашего метода. Проверьте truthy
, и тернарный оператор сделает свое дело
var modules = MM.getModules();
modules = param1 ? modules.withClass(param1) : modules;
modules = param2 ? modules.exceptWithClass(param2) : modules;
modules.enumerate(function(module) {
module.hide(
// some other code
);
});
чтобы пропустить первый параметр
hide_modules(null,'string2');
чтобы пропустить второй параметр
hide_modules('string1');
Комментарии:
1. Хорошо, я думаю, что я реализовал то, что вы предложили, но теперь я получаю сообщение об ошибке. Вот теперь моя полная функция:
function(hideClasses,exceptClasses) { var modules=MM.getModules(); modules = hideClasses amp;amp; modules.withClass(hideClasses); modules = exceptClasses amp;amp; modules.exceptWithClass(exceptClasses); modules.enumerate(function(module) { module.hide( // some code ); }); },
2. MMM-Face-Reco-DNN.js: 240 не найдено (в обещании) Ошибка типа: не удается прочитать свойство ‘exceptWithClass’, равное нулю в Class.hide_modules (MMM-Face-Reco-DNN.js:240) в Class.notificationReceived (MMM-Face-Reco-DNN.js:371) при отправке уведомления (main.js: 96) в main.js:64
3. Извините за форматирование. Кажется, я не могу понять это правильно, но строка 240
modules = exceptClasses amp;amp; modules.exceptWithClass(exceptClasses);
, и я вызываю функцию, подобную:hide_modules(null,this.config.classes_noface)