Одинаковая функция обратного вызова события на нескольких элементах - назначается циклом - PullRequest
0 голосов
/ 28 января 2012

Я сделал такой код, чтобы упростить подключение обратных вызовов для событий:

dojo.ready(function() {
    for(var action in page.actions) {
        for(var key in page.actions[action]) {
            (function() {
                dojo.query(key).connect(action, function(evt) {
                    if(page.actions[action][key]() == false) 
                        dojo.stopEvent(evt); 
                });
            })();
        }
    }
});

page = {
    actions : 
    {
        onclick : 
        {
            "#page-action-one" : function()
            {
                alert("Action 1");
                return false;
            },
            "#page-action-two" : function()
            {
                alert("Action 2");
                return false;
            }
        }
    }
};

Но нажмите «# page-action-one» и «# page-action-two», чтобы сделать то же самое предупреждение («Действие 2»). Я пытался использовать Cloer, но без эффекта. Я сейчас, я могу сделать это по-другому, но я бы хотел сейчас, почему это происходит.

Спасибо за советы.

1 Ответ

0 голосов
/ 28 января 2012

Вы пытаетесь исправить проблему с закрытием, заключив назначение обработчика событий в анонимную функцию. Но ключом к этому трюку является то, что вы должны передать циклическую переменную (или переменные) в качестве аргумента анонимной функции - в противном случае оболочка анонимной функции ничего не делает. Попробуйте:

dojo.ready(function() {
    for(var action in page.actions) {
        for(var key in page.actions[action]) {
            (function(action, key) {
                dojo.query(key).connect(action, function(evt) {
                    if(page.actions[action][key]() == false) 
                        dojo.stopEvent(evt); 
                });
            })(action, key);
        }
    }
});

Это «исправляет» значения action и key во время вызова анонимной функции, поэтому в анонимной функции эти имена переменных применяются только к переданным аргументам, а не к именованным переменным во внешней области , который будет обновляться при следующей итерации цикла.

...