Значения ключей перезаписи массива Javascript - PullRequest
1 голос
/ 23 июля 2010

У меня есть хэш-карта, созданная для управления событиями для кнопок.Это определяется следующим образом:

var Signage_Manager = {

init: function() {

    Signage_Manager.buttonActions.set_events();

},
buttonActions: {
    buttons: {

        '#add_product': {action: 'navigate', href: '/manager/add_product'},
        '.back_to_dashboard': {action: 'navigate', href: '/manager/dashboard'}

    },
    set_events: function() {
        for(var button in Signage_Manager.buttonActions.buttons){   
            if(Signage_Manager.buttonActions.buttons[button].action == 'navigate') {
                $(button).live('click', function() {
                    console.log(Signage_Manager.buttonActions.buttons[button].href);                                                 
                });
            }
            else {
                $(button).live('click', function() {
                    //
                    console.log('not navigate');                                                     
                });
            }
        }
    }
}
};

Проблема в том, что, когда я нажимаю кнопку «add_product», он пытается использовать строку href «/ manager / dashboard» вместо строки «/ manager / add_product»это находится в определенной строке.

Кто-нибудь может предложить здесь руку?

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Из-за замыкания ваши действующие функции будут закрываться по той же самой переменной кнопки , которая меняется в каждой итерации . И поэтому в конце все обработчики событий будут использовать одну и ту же кнопку: последняя . Чтобы сохранить имя кнопки, вы можете создать внутреннюю область действия для обработчиков событий, чтобы каждая функция имела свой собственный селектор jQuery.

if (Signage_Manager.buttonActions.buttons[button].action == 'navigate') {
  (function(button) {
    $(button).live('click', function () {
      console.log(Signage_Manager.buttonActions.buttons[button].href);
    });
  })(button);
}
0 голосов
/ 23 июля 2010

Внутри вызова live() имеется ссылка на переменную button внешней области видимости. Когда вы нажимаете кнопку и анонимная функция выполняется, цикл уже завершен, поэтому кнопка равна последнему элементу хеш-таблицы. Вы должны сохранить элемент хеш-таблицы для каждой кнопки.

Возможное решение с использованием метода data () может быть:

$(button).data("button", Signage_Manager.buttonActions.buttons[button]).live('click', function() {
    console.log($(this).data("button").href);                            
});
...