Использование троичной "?:" оператор с функциями прослушивания события нажатия


Недавно я делал некоторые моды на некоторые старый код, я поддерживая за пару лет.

Как часть более широкого набора сценариев с помощью Yahoo Юи 2.2 (да, старая) для диалогового окна стиль панели, у меня есть функция, которая прослушивает события click на 3 кнопки в панели:

addFooListeners = function (panelType) {

    YAHOO.util.Event.addListener("show" + panelType, "click", showFoo, eval(ns + ".panel_" + panelType), true);
    YAHOO.util.Event.addListener("hide" + panelType, "click", hideFoo, eval(ns + ".panel_" + panelType), true);
    YAHOO.util.Event.addListener("commit" + panelType, "click", commitFoo, eval(ns + ".panel_" + panelType), true);

}

Этот код является результатом ряда панелей/диалоги, имеющих практически идентичные поведения.

Для этого этапа развития мне нужно добавить возможность делать вещи немного по-разному, время от времени, поэтому я добавил объект, переопределяет который позволяет мне, чтобы показать, скрыть и совершения действий в другом месте. Я придумал следующее:

addFooListeners = function (panelType, overrides) {

    var handlers = {
        show: ( overrides != null ? ( overrides.show != null ? overrides.show : showFoo ) : showFoo ),
        hide: ( overrides != null ? ( overrides.hide != null ? overrides.hide : hideFoo ) : hideFoo ),
        commit: ( overrides != null ? ( overrides.commit != null ? overrides.commit : commitFoo ) : commitFoo )
    }

    YAHOO.util.Event.addListener("show" + panelType, "click", handlers.show, eval(ns + ".panel_" + panelType), true);
    YAHOO.util.Event.addListener("hide" + panelType, "click", handlers.hide, eval(ns + ".panel_" + panelType), true);
    YAHOO.util.Event.addListener("commit" + panelType, "click", handlers.commit, eval(ns + ".panel_" + panelType), true);
}

Как вы можете видеть, я несу поведение по умолчанию, если соответствующий атрибут переопределяет объект расположен с другой функцией (именованный или Анонимный).

Есть ли уборщик / более читабельным способом лаконично установки обработчиков объекта? Вложенные тернарные, кажется, глаза должны быть загромождения вещей немного, но другие подходы, как , если ( переопределяет != значение null ) { ... } похоже, лажа.



9984
26
задан 30 января 2011 в 11:01 Источник Поделиться
Комментарии
2 ответа

Давайте сделаем некоторые крепления. Во-первых, это, как вы проходите дополнительный (нелогические) параметров в JS (в хорошем смыслеТМ):

addFooListeners = function (panelType, handlers) {
handlers = handlers || {};
handlers.show = handlers.show || showFoo;
handlers.hide = handlers.hide || hideFoo;
handlers.commit = handlers.commit || commitFoo;

Выше может быть переписан в более опрятный способ с помощью jQuery (не уверен, что название Юи эквивалентно выразить это):

handlers = $.extend({
show : showFoo,
hide : hideFoo,
commit: commitFoo
}, handlers || {})

Теперь, используя функцию eval для этого кода является преступником. Говорят, объект НС относится к это модуль, то вы можете сделать это вместо того, чтобы использовать eval:

YAHOO.util.Event.addListener("show" + panelType, "click", handlers.show, module["panel_" + panelType], true);
YAHOO.util.Event.addListener("hide" + panelType, "click", handlers.hide, module["panel_" + panelType], true);
YAHOO.util.Event.addListener("commit" + panelType, "click", handlers.commit, module["panel_" + panelType], true);

Теперь, как вы видите, вы передаете много событий подобным образом. Ты думаешь определения функции addPanelListener в вашей функции?

function addPanelListener (event, panelType, handler) {
YAHOO.util.Event.addListener(event + panelType, "click", handler, module["panel_" + panelType], true);
}

addPanelListener("show" , panelType, handlers.show);
addPanelListener("hide" , panelType, handlers.hide);
addPanelListener("commit", panelType, handlers.commit):

Надеюсь, что это помогает.

28
ответ дан 31 января 2011 в 07:01 Источник Поделиться

Похоже, что вы можете уменьшить, что троичный бит с помощью && такой:

var handlers = {
show: ( overrides != null && overrides.show != null ? overrides.show : showFoo ),
hide: ( overrides != null && overrides.hide != null ? overrides.hide : hideFoo ),
commit: ( overrides != null && overrides.commit != null ? overrides.commit : commitFoo )
}

Я не слишком хорошо знакомы с JavaScript, но никак параметра функции должны быть проверены на нуль? Например, вы можете дополнительно сократить проверки что-то подобное?

show:  ( overrides && overrides.show ? overrides.show : showFoo ),
hide: ( overrides && overrides.hide ? overrides.hide : hideFoo ),
// ...

7
ответ дан 31 января 2011 в 12:01 Источник Поделиться